Gtk GL Extension

Linux specific forum
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Gtk GL Extension

Post by Guimauve »

Hello everyone,

I have search for information about how to create a OpenGL Rendering Canvas Gadget and I have found this : Gtk GL Extension

Now my questions are :
  • 1. What is the CanvasCadget() in the background (On the Linux Platform indeed) ? A GtkDrawingArea ?
  • 2. It is possible to hack the CanvasGadget() and use it as a OpenGL Rendering buffer and If it's the case, how to do it ?
  • 3. If 2. are impossible, how to use the Gtk GL Extension library to create a full featured "GLCanvas" PureBasic Gadget, I mean making it to work with ResizeGadget(), can be used with SplitterGadget(), be placed in PanelGadget() / ContainerGadget(), sending signal to the EventGadget() system, and so on ?
Thanks in advance.
Guimauve
User avatar
idle
Always Here
Always Here
Posts: 6026
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Gtk GL Extension

Post by idle »

I haven't tried to use gtkglext yet but it certainly looks interesting
Did you see this
http://developer.gnome.org/gtkglext/sta ... idget.html
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

idle wrote:I haven't tried to use gtkglext yet but it certainly looks interesting
Did you see this
http://developer.gnome.org/gtkglext/sta ... idget.html
Yes I have see it, but I'm not sure about how to integrate it to PureBasic Gadget system. I have never used the Gtk+ library directly before, so I have to figure it how it work before to do anything else. If someone already know how, a little example can be useful.

Best regards.
Guimauve
Last edited by Guimauve on Fri Jan 06, 2012 11:38 pm, edited 2 times in total.
User avatar
idle
Always Here
Always Here
Posts: 6026
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Gtk GL Extension

Post by idle »

I'm just looking at in myself but I'm not sure if I've got the required libs at the moment
Windows 11, Manjaro, Raspberry Pi OS
Image
freak
PureBasic Team
PureBasic Team
Posts: 5948
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Re: Gtk GL Extension

Post by freak »

> 1. What is the CanvasCadget() in the background (On the Linux Platform indeed) ? A GtkDrawingArea ?

Yes.

> 2. It is possible to hack the CanvasGadget() and use it as a OpenGL Rendering buffer and If it's the case, how to do it ?

The API seems to suggest that it can be used on any widget. Try creating a ContainerGadget and calling gtk_widget_set_gl_capability() on it (using GadgetID())
quidquid Latine dictum sit altum videtur
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

Hello everyone,

The GTK GL Extension - Constants.pb

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Gtk GL Extension
; File Name : Gtk GL Extension - Constants.pb
; File version: 0.0.1
; Programmation : Correction needed !
; Programmed by : Guimauve
; Date : 06-01-2012
; Last Update : 07-01-2012
; PureBasic code : 4.60
; Plateform : Linux
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;* Source : http://developer.gnome.org/gtkglext/stable/gtkglext-gdkgltokens.html
;* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#GDK_GL_DONT_CARE = 0
#GDK_GL_NONE      = 0
#GDK_GL_ATTRIB_LIST_NONE = 0
#GDK_GL_SUCCESS = 0

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GDK_GL_CONFIGS

#GDK_GL_USE_GL           = 1
#GDK_GL_BUFFER_SIZE      = 2
#GDK_GL_LEVEL            = 3
#GDK_GL_RGBA             = 4
#GDK_GL_DOUBLEBUFFER     = 5
#GDK_GL_STEREO           = 6
#GDK_GL_AUX_BUFFERS      = 7
#GDK_GL_RED_SIZE         = 8
#GDK_GL_GREEN_SIZE       = 9
#GDK_GL_BLUE_SIZE        = 10
#GDK_GL_ALPHA_SIZE       = 11
#GDK_GL_DEPTH_SIZE       = 12
#GDK_GL_STENCIL_SIZE     = 13
#GDK_GL_ACCUM_RED_SIZE   = 14
#GDK_GL_ACCUM_GREEN_SIZE = 15
#GDK_GL_ACCUM_BLUE_SIZE  = 16
#GDK_GL_ACCUM_ALPHA_SIZE = 17

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; FBConfig-specific attributes. [ GLX 1.3 And later ]

#GDK_GL_CONFIG_CAVEAT                    = $20
#GDK_GL_X_VISUAL_TYPE_EXT                = $22
#GDK_GL_TRANSPARENT_TYPE_EXT             = $23
#GDK_GL_TRANSPARENT_INDEX_VALUE_EXT      = $24
#GDK_GL_TRANSPARENT_RED_VALUE_EXT        = $25
#GDK_GL_TRANSPARENT_GREEN_VALUE_EXT      = $26
#GDK_GL_TRANSPARENT_BLUE_VALUE_EXT       = $27
#GDK_GL_TRANSPARENT_ALPHA_VALUE_EXT      = $28

#GDK_GL_DRAWABLE_TYPE              = $8010
#GDK_GL_RENDER_TYPE                = $8011
#GDK_GL_X_RENDERABLE               = $8012
#GDK_GL_FBCONFIG_ID                = $8013
#GDK_GL_MAX_PBUFFER_WIDTH          = $8016
#GDK_GL_MAX_PBUFFER_HEIGHT         = $8017
#GDK_GL_MAX_PBUFFER_PIXELS         = $8018
#GDK_GL_VISUAL_ID                  = $800B
#GDK_GL_SCREEN                     = $800C

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Multisampling configuration attributes. [ GLX 1.4 And later ]

#GDK_GL_SAMPLE_BUFFERS             = 100000
#GDK_GL_SAMPLES                    = 100001

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLConfigCaveat

#GDK_GL_CONFIG_CAVEAT_DONT_CARE    = $FFFFFFFF ;/* GDK_GL_DONT_CARE */
#GDK_GL_CONFIG_CAVEAT_NONE         = $8000     ;/* GDK_GL_NONE */
#GDK_GL_SLOW_CONFIG                = $8001
#GDK_GL_NON_CONFORMANT_CONFIG      = $800D

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLVisualType

#GDK_GL_VISUAL_TYPE_DONT_CARE      = $FFFFFFFF ; /* GDK_GL_DONT_CARE */
#GDK_GL_TRUE_COLOR                 = $8002
#GDK_GL_DIRECT_COLOR               = $8003
#GDK_GL_PSEUDO_COLOR               = $8004
#GDK_GL_STATIC_COLOR               = $8005
#GDK_GL_GRAY_SCALE                 = $8006
#GDK_GL_STATIC_GRAY                = $8007

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLTransparentType

#GDK_GL_TRANSPARENT_NONE           = $8000 ;/* GDK_GL_NONE */
#GDK_GL_TRANSPARENT_RGB            = $8008
#GDK_GL_TRANSPARENT_INDEX          = $8009

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLDrawableTypeMask

#GDK_GL_WINDOW_BIT                 = 1 << 0 ;/* 0x00000001 */
#GDK_GL_PIXMAP_BIT                 = 1 << 1 ;/* 0x00000002 */
#GDK_GL_PBUFFER_BIT                = 1 << 2 ;/* 0x00000004 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLRenderTypeMask

#GDK_GL_RGBA_BIT                   = 1 << 0 ;/* 0x00000001 */
#GDK_GL_COLOR_INDEX_BIT            = 1 << 1 ;/* 0x00000002 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLBufferMask

#GDK_GL_FRONT_LEFT_BUFFER_BIT      = 1 << 0 ;/* 0x00000001 */
#GDK_GL_FRONT_RIGHT_BUFFER_BIT     = 1 << 1 ;/* 0x00000002 */
#GDK_GL_BACK_LEFT_BUFFER_BIT       = 1 << 2 ;/* 0x00000004 */
#GDK_GL_BACK_RIGHT_BUFFER_BIT      = 1 << 3 ;/* 0x00000008 */
#GDK_GL_AUX_BUFFERS_BIT            = 1 << 4 ;/* 0x00000010 */
#GDK_GL_DEPTH_BUFFER_BIT           = 1 << 5 ;/* 0x00000020 */
#GDK_GL_STENCIL_BUFFER_BIT         = 1 << 6 ;/* 0x00000040 */
#GDK_GL_ACCUM_BUFFER_BIT           = 1 << 7 ;/* 0x00000080 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLConfigError

#GDK_GL_BAD_SCREEN                 = 1 ;/* screen # is bad */
#GDK_GL_BAD_ATTRIBUTE              = 2 ;/* attribute To get is bad */
#GDK_GL_NO_EXTENSION               = 3 ;/* no glx extension on server */
#GDK_GL_BAD_VISUAL                 = 4 ;/* visual # Not known by GLX */
#GDK_GL_BAD_CONTEXT                = 5 ;/* returned only by import_context EXT? */
#GDK_GL_BAD_VALUE                  = 6 ;/* returned only by glXSwapIntervalSGI? */
#GDK_GL_BAD_ENUM                   = 7 ;/* unused? */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLRenderType

#GDK_GL_RGBA_TYPE                  = $8014
#GDK_GL_COLOR_INDEX_TYPE           = $8015

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLDrawableAttrib

#GDK_GL_PRESERVED_CONTENTS         = $801B
#GDK_GL_LARGEST_PBUFFER            = $801C
#GDK_GL_WIDTH                      = $801D
#GDK_GL_HEIGHT                     = $801E
#GDK_GL_EVENT_MASK                 = $801F

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLPbufferAttrib

#GDK_GL_PBUFFER_PRESERVED_CONTENTS = $801B ;/* GDK_GL_PRESERVED_CONTENTS */
#GDK_GL_PBUFFER_LARGEST_PBUFFER    = $801C ;/* GDK_GL_LARGEST_PBUFFER */
#GDK_GL_PBUFFER_HEIGHT             = $8040
#GDK_GL_PBUFFER_WIDTH              = $8041

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLEventMask

#GDK_GL_PBUFFER_CLOBBER_MASK       = 1 << 27 ;/* 0x08000000 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLEventType

#GDK_GL_DAMAGED                    = $8020
#GDK_GL_SAVED                      = $8021

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLDrawableType

#GDK_GL_WINDOW                     = $8022
#GDK_GL_PBUFFER                    = $8023

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLConfigMode

#GDK_GL_MODE_RGB         = 0
#GDK_GL_MODE_RGBA        = 0      ;/* same As RGB */
#GDK_GL_MODE_INDEX       = 1 << 0
#GDK_GL_MODE_SINGLE      = 0
#GDK_GL_MODE_DOUBLE      = 1 << 1
#GDK_GL_MODE_STEREO      = 1 << 2
#GDK_GL_MODE_ALPHA       = 1 << 3
#GDK_GL_MODE_DEPTH       = 1 << 4
#GDK_GL_MODE_STENCIL     = 1 << 5
#GDK_GL_MODE_ACCUM       = 1 << 6
#GDK_GL_MODE_MULTISAMPLE = 1 << 7  ;/* Not supported yet */

Structure GdkGLContext
EndStructure 

Structure GdkGLConfig
EndStructure

Structure GdkGLDrawable
EndStructure

Structure GdkGLPixmap
EndStructure 

Structure GdkGLWindow
EndStructure 

Structure GdkPixmap
EndStructure 

Structure GdkWindow
EndStructure 

Structure VisualID
EndStructure 

Structure PangoFontDescription
EndStructure 

Structure GLXContext  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
The "Gtk GL Extension - Import.pb"

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GTK GL Extension
; File Name : Gtk GL Extension - Import.pb
; File version: 0.0.0
; Programmation : OK
; Programmed by : Guimauve
; Date : 07-01-2012
; Last Update : 07-01-2012
; PureBasic code : 4.60
; Plateform : Linux
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

ImportC "/usr/lib/libgtkglext-x11-1.0.so.0.0.0"
  
  ; /* Initialization */
  
  gdk_gl_init(*argc.l, *argv)
  gdk_gl_init_check(*argc.l, *argv)
  gdk_gl_parse_args(*argc.l, *argv)
  
  ; /* OpenGL-Capable Widget */
  
  gtk_widget_set_gl_capability(*widget.GtkWidget, *glconfig.GdkGLConfig, *share_list.GdkGLContext, direct.l, render_type.l)
  gtk_widget_is_gl_capable(*widget.GtkWidget)
  gtk_widget_get_gl_config(*widget.GtkWidget)
  gtk_widget_create_gl_context(*widget.GtkWidget, *share_list.GdkGLContext, direct.l, render_type.l)
  gtk_widget_get_gl_context(*widget.GtkWidget)
  gtk_widget_get_gl_window(*widget.GtkWidget)
  
EndImport 

ImportC "/usr/lib/libgdkglext-x11-1.0.so.0.0.0"

  ; /* Query */
  gdk_gl_query_extension()
  gdk_gl_query_extension_for_display(*display.GdkDisplay)
  gdk_gl_query_version(*major.l, *minor.l)
  gdk_gl_query_version_for_display(*display.GdkDisplay, *major.l, *minor.l)
  gdk_gl_query_gl_extension(*extension.Character)
  gdk_gl_get_proc_address(*proc_name.Character)

  ; /* Frame Buffer Configuration */
  
  gdk_gl_config_new(*attrib_list.l)
  gdk_gl_config_new_for_screen(*screen.GdkScreen, *attrib_list.l)
  gdk_gl_config_new_by_mode(mode.l)
  gdk_gl_config_new_by_mode_for_screen(*screen.GdkScreen, mode.l)
  gdk_gl_config_get_screen(*glconfig.GdkGLConfig)
  gdk_gl_config_get_attrib(*glconfig.GdkGLConfig, attribute.l, *value.l)
  gdk_gl_config_get_colormap(*glconfig.GdkGLConfig)
  gdk_gl_config_get_visual(*glconfig.GdkGLConfig)
  gdk_gl_config_get_depth(*glconfig.GdkGLConfig)
  gdk_gl_config_get_layer_plane(*glconfig.GdkGLConfig)
  gdk_gl_config_get_n_aux_buffers(*glconfig.GdkGLConfig)
  gdk_gl_config_get_n_sample_buffers(*glconfig.GdkGLConfig)
  gdk_gl_config_is_rgba(*glconfig.GdkGLConfig)
  gdk_gl_config_is_double_buffered(*glconfig.GdkGLConfig)
  gdk_gl_config_is_stereo(*glconfig.GdkGLConfig)
  gdk_gl_config_has_alpha(*glconfig.GdkGLConfig)
  gdk_gl_config_has_depth_buffer(*glconfig.GdkGLConfig)
  gdk_gl_config_has_stencil_buffer(*glconfig.GdkGLConfig)
  gdk_gl_config_has_accum_buffer(*glconfig.GdkGLConfig)
  
  ; /* Rendering Context */
  
  gdk_gl_context_new(*gldrawable.GdkGLDrawable, *share_list.GdkGLContext, direct.l, render_type.l)
  gdk_gl_context_destroy(*glcontext.GdkGLContext)
  gdk_gl_context_copy(*glcontext.GdkGLContext, *src.GdkGLContext, mask.l)
  gdk_gl_context_get_gl_drawable(*glcontext.GdkGLContext)
  gdk_gl_context_get_gl_config(*glcontext.GdkGLContext)
  gdk_gl_context_get_share_list(*glcontext.GdkGLContext)
  gdk_gl_context_is_direct(*glcontext.GdkGLContext)
  gdk_gl_context_get_render_type(*glcontext.GdkGLContext)
  gdk_gl_context_get_current()
  
  ; /* Rendering Surface */ 
  
  gdk_gl_drawable_make_current(*gldrawable.GdkGLDrawable, *glcontext.GdkGLContext)
  gdk_gl_drawable_is_double_buffered(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_swap_buffers(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_wait_gl(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_wait_gdk(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_gl_begin(*gldrawable.GdkGLDrawable, *glcontext.GdkGLContext)
  gdk_gl_drawable_gl_end(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_get_gl_config(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_get_size(*gldrawable.GdkGLDrawable, *width.l, *height.l)
  gdk_gl_drawable_get_current()
  
  ; /* OpenGL Pixmap */
  
  gdk_gl_pixmap_new(*glconfig.GdkGLConfig, *pixmap.GdkPixmap, *attrib_list.l)
  gdk_gl_pixmap_destroy(*pixmap.GdkPixmap)
  gdk_gl_pixmap_get_pixmap(*pixmap.GdkPixmap)
  gdk_gl_pixmap_ref(*glpixmap.GdkGLPixmap)
  gdk_gl_pixmap_unref(*glpixmap.GdkGLPixmap)
  gdk_gl_pixmap_make_current(*glpixmap.GdkGLPixmap, *context.GdkGLContext)
  gdk_pixmap_set_gl_capability(*pixmap.GdkPixmap, *glconfig.GdkGLConfig, *attrib_list.l)
  gdk_pixmap_unset_gl_capability(*pixmap.GdkPixmap)
  gdk_pixmap_is_gl_capable(*pixmap.GdkPixmap)
  
  ; /* OpenGL Window */
  
  gdk_gl_window_new(*glconfig.GdkGLConfig, *window.GdkWindow, *attrib_list.l)
  gdk_gl_window_destroy(*window.GdkWindow)
  gdk_gl_window_get_window(*window.GdkWindow)
  gdk_window_set_gl_capability(*window.GdkWindow, *glconfig.GdkGLConfig, *attrib_list.l)
  gdk_window_unset_gl_capability(*window.GdkWindow)
  gdk_window_is_gl_capable(*window.GdkWindow)
  gdk_window_get_gl_window(*window.GdkWindow)
  
  ; /* Font Rendering */
  
  gdk_gl_font_use_pango_font(*font_desc.PangoFontDescription, first.l, count.l, list_base.l)
  gdk_gl_font_use_pango_font_for_display(*display.GdkDisplay, *font_desc.PangoFontDescription, first.l, count.l, list_base.l)
  
  ; /* Geometric Object Rendering */
  
  gdk_gl_draw_cube(solid.l, size.d)
  gdk_gl_draw_sphere(solid.l,radius.d, slices.l, stacks.l)
  gdk_gl_draw_cone(solid.l, base.d, height.d, slices.l, stacks.l)
  gdk_gl_draw_torus(solid.l, inner_radius.d, outer_radius.d, nsides.l, rings.l)
  gdk_gl_draw_tetrahedron(solid.l)
  gdk_gl_draw_octahedron(solid.l)
  gdk_gl_draw_dodecahedron(solid.l)
  gdk_gl_draw_icosahedron(solid.l)
  gdk_gl_draw_teapot(solid.l, scale.d)
    
  ; /* Other commands */
  
  gdk_gl_query()
  gdk_gl_choose_visual(*attrList.l)
  gdk_gl_get_config(*visual.GdkVisual, attrib.l)

  gdk_gl_context_share_new(*visual.GdkVisual, *sharelist.GdkGLContext, direct.l)
  gdk_gl_context_ref(*context.GdkGLContext)
  gdk_gl_context_unref(*context.GdkGLContext)
  gdk_gl_make_current(*drawable.GdkDrawable, *context.GdkGLContext)
  gdk_gl_swap_buffers(*drawable.GdkDrawable)
  gdk_gl_wait_gdk()
  gdk_gl_wait_gl()
  
  ; /* fonts */
  
  gdk_gl_use_gdk_font(*font.GdkFont, first.l, count.l, list_base.l)
  
EndImport

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

Hello everyone,
freak wrote:The API seems to suggest that it can be used on any widget. Try creating a ContainerGadget and calling gtk_widget_set_gl_capability() on it (using GadgetID())
Sorry Freak but a simple " gtk_widget_set_gl_capability(GadgetID(0), ...)" on a ContainerGadget() don't work. The following code need the 2 files from the previous post.

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : Gtk GL Extension - Test
; File Name : Gtk GL Extension - .pb
; File version: 0.0.0
; Programmation : Not working
; Programmed by : Guimauve
; Date : 07-01-2012
; Last Update : 07-01-2012
; PureBasic code : 4.60
; Plateform : Linux
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

IncludeFile "Gtk GL Extension - Constantes.pb"
IncludeFile "Gtk GL Extension - Import.pb"

If OpenWindow(0, 0, 0, 800, 600, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
  
  ContainerGadget(0, 5, 5, 790, 590) 
  CloseGadgetList()

  If gtk_widget_set_gl_capability(GadgetID(0), gdk_gl_config_new_by_mode(#GDK_GL_MODE_RGBA | #GDK_GL_MODE_DOUBLE), #Null, #True ,#GDK_GL_RGBA_TYPE) = #False
    Debug "Impossible to make the ContainerGadget() GL Capable"
  EndIf
 
  Repeat
    
    EventID = WaitWindowEvent()
    
    Select EventID
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
        EndSelect
        
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
I found an example here : http://www.developpez.net/forums/d91469 ... iche-rien/

Code: Select all

//fonctions principales
void buildGui(void) //construction de l'interface graphique
{
    GdkGLConfig * config;
    //fenetre principale *************************
    fenetre = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(fenetre), "cartographie astronomique");
    gtk_window_set_default_size(GTK_WINDOW(fenetre), 1000, 800);
    gtk_window_set_position (GTK_WINDOW (fenetre), GTK_WIN_POS_NONE);
    //connections
    g_signal_connect(GTK_OBJECT(fenetre), "destroy", G_CALLBACK(gtk_main_quit), NULL);//quitter
    g_signal_connect(GTK_OBJECT(fenetre), "delete_event",	G_CALLBACK(gtk_main_quit), NULL);
    //carte du ciel
    gl = gtk_drawing_area_new();
    //OpenGL via Gtkglext
    config = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE);
    gtk_widget_set_gl_capability(GTK_WIDGET(gl), config, NULL, TRUE, GDK_GL_RGBA_TYPE);
    //signaux
    gtk_signal_connect (GTK_OBJECT (gl), "realize", G_CALLBACK(Carte_realize), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "expose_event", G_CALLBACK(Carte_expose_event), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "configure_event", G_CALLBACK(Carte_configure_event), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "motion_notify_event", G_CALLBACK(Carte_motion_notify_event), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "button_press_event", G_CALLBACK(Carte_button_press_event), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "button_release_event", G_CALLBACK(Carte_button_release_event), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "key_press_event", G_CALLBACK(Carte_key_press_event), NULL);
    gtk_signal_connect (GTK_OBJECT (gl), "key_release_event", G_CALLBACK(Carte_key_release_event), NULL);
    gtk_widget_set_events (gl, GDK_EXPOSURE_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
        | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK);
    //GTK_WIDGET_SET_FLAGS (gui->da_Carte, GTK_CAN_FOCUS);//permettre le signal key press et key release
    gtk_container_add(GTK_CONTAINER(fenetre), GTK_WIDGET(gl));
As far I understand :

gl = gtk_drawing_area_new() ---> This command create a GTK Drawing Area
gtk_widget_set_gl_capability(GTK_WIDGET(gl), config, NULL, TRUE, GDK_GL_RGBA_TYPE) ---> This command add stuff to make de GTK Drawing Area GL Capable
gtk_container_add(GTK_CONTAINER(fenetre), GTK_WIDGET(gl)) ---> And this command Add the GTK Drawing Area to a Container Widget

So how to reach the ContainerGadget() "GTK Drawing Area" if any ?

Edit : I have also try with the CanvasGadget() but the result is the same.

Thanks in advance
Guimauve
User avatar
idle
Always Here
Always Here
Posts: 6026
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Gtk GL Extension

Post by idle »

I tried yesterday and ran out of time, the issue seems to be that the gadget isn't realized
GTK asserts !gtk_widget_get_realized failed so I assume we would need to do it via a call back
but I couldn't find a suitable signal to use for a callback to set the gl_capibility
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

The GTK library is a C procedural library but it work so differently from what we have in PureBasic. I hate to go purely experimental when I use externals libs especially when C examples are so different from what we do with PB. Using SDL it's very easy, using OpenGL also easy but GTK+ it's a different story.

They use a very different approach with no Event Management loop in the programmer side. For example when a button is created we have to connect it with a function in our program. It's not Good it's not Bad it's just different and once again we are at the mercy of the PureBasic development team. I don't ask them to walk to reach the moon and bring it back on the Earth holding it on their shoulders.

What I ask, a clear tutorial about how to wrap GTK function to create full featured GL Capable Canvas Gadget with of course the Mouse XY position on the gadget, mouse button / wheel event, keyboard event to work seamlessly with all other Gadgets, Menus, Contextual Menus, Tooltips.

Best regards.
Guimauve
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

Hello everyone,

This is a not fully working example of GLAreaGadget(). The code include a simplified version of OpenGL import library.

Code: Select all

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : GLAreaGadget
; File Name : GLAreaGadget.pb
; File version: 0.0.1
; Programmation : In progress
; Programmed by : Guimauve and Idle
; Date : 09-01-2012
; Last Update : 09-01-2012
; PureBasic code : 4.60
; Platform : Linux
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;* Source : http://developer.gnome.org/gtkglext/stable/gtkglext-gdkgltokens.html
;* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#GDK_GL_DONT_CARE = 0
#GDK_GL_NONE      = 0
#GDK_GL_ATTRIB_LIST_NONE = 0
#GDK_GL_SUCCESS = 0

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GDK_GL_CONFIGS

#GDK_GL_USE_GL           = 1
#GDK_GL_BUFFER_SIZE      = 2
#GDK_GL_LEVEL            = 3
#GDK_GL_RGBA             = 4
#GDK_GL_DOUBLEBUFFER     = 5
#GDK_GL_STEREO           = 6
#GDK_GL_AUX_BUFFERS      = 7
#GDK_GL_RED_SIZE         = 8
#GDK_GL_GREEN_SIZE       = 9
#GDK_GL_BLUE_SIZE        = 10
#GDK_GL_ALPHA_SIZE       = 11
#GDK_GL_DEPTH_SIZE       = 12
#GDK_GL_STENCIL_SIZE     = 13
#GDK_GL_ACCUM_RED_SIZE   = 14
#GDK_GL_ACCUM_GREEN_SIZE = 15
#GDK_GL_ACCUM_BLUE_SIZE  = 16
#GDK_GL_ACCUM_ALPHA_SIZE = 17

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; FBConfig-specific attributes. [ GLX 1.3 And later ]

#GDK_GL_CONFIG_CAVEAT                    = $20
#GDK_GL_X_VISUAL_TYPE_EXT                = $22
#GDK_GL_TRANSPARENT_TYPE_EXT             = $23
#GDK_GL_TRANSPARENT_INDEX_VALUE_EXT      = $24
#GDK_GL_TRANSPARENT_RED_VALUE_EXT        = $25
#GDK_GL_TRANSPARENT_GREEN_VALUE_EXT      = $26
#GDK_GL_TRANSPARENT_BLUE_VALUE_EXT       = $27
#GDK_GL_TRANSPARENT_ALPHA_VALUE_EXT      = $28

#GDK_GL_DRAWABLE_TYPE              = $8010
#GDK_GL_RENDER_TYPE                = $8011
#GDK_GL_X_RENDERABLE               = $8012
#GDK_GL_FBCONFIG_ID                = $8013
#GDK_GL_MAX_PBUFFER_WIDTH          = $8016
#GDK_GL_MAX_PBUFFER_HEIGHT         = $8017
#GDK_GL_MAX_PBUFFER_PIXELS         = $8018
#GDK_GL_VISUAL_ID                  = $800B
#GDK_GL_SCREEN                     = $800C

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Multisampling configuration attributes. [ GLX 1.4 And later ]

#GDK_GL_SAMPLE_BUFFERS             = 100000
#GDK_GL_SAMPLES                    = 100001

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLConfigCaveat

#GDK_GL_CONFIG_CAVEAT_DONT_CARE    = $FFFFFFFF ;/* GDK_GL_DONT_CARE */
#GDK_GL_CONFIG_CAVEAT_NONE         = $8000     ;/* GDK_GL_NONE */
#GDK_GL_SLOW_CONFIG                = $8001
#GDK_GL_NON_CONFORMANT_CONFIG      = $800D

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLVisualType

#GDK_GL_VISUAL_TYPE_DONT_CARE      = $FFFFFFFF ; /* GDK_GL_DONT_CARE */
#GDK_GL_TRUE_COLOR                 = $8002
#GDK_GL_DIRECT_COLOR               = $8003
#GDK_GL_PSEUDO_COLOR               = $8004
#GDK_GL_STATIC_COLOR               = $8005
#GDK_GL_GRAY_SCALE                 = $8006
#GDK_GL_STATIC_GRAY                = $8007

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLTransparentType

#GDK_GL_TRANSPARENT_NONE           = $8000 ;/* GDK_GL_NONE */
#GDK_GL_TRANSPARENT_RGB            = $8008
#GDK_GL_TRANSPARENT_INDEX          = $8009

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLDrawableTypeMask

#GDK_GL_WINDOW_BIT                 = 1 << 0 ;/* 0x00000001 */
#GDK_GL_PIXMAP_BIT                 = 1 << 1 ;/* 0x00000002 */
#GDK_GL_PBUFFER_BIT                = 1 << 2 ;/* 0x00000004 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLRenderTypeMask

#GDK_GL_RGBA_BIT                   = 1 << 0 ;/* 0x00000001 */
#GDK_GL_COLOR_INDEX_BIT            = 1 << 1 ;/* 0x00000002 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLBufferMask

#GDK_GL_FRONT_LEFT_BUFFER_BIT      = 1 << 0 ;/* 0x00000001 */
#GDK_GL_FRONT_RIGHT_BUFFER_BIT     = 1 << 1 ;/* 0x00000002 */
#GDK_GL_BACK_LEFT_BUFFER_BIT       = 1 << 2 ;/* 0x00000004 */
#GDK_GL_BACK_RIGHT_BUFFER_BIT      = 1 << 3 ;/* 0x00000008 */
#GDK_GL_AUX_BUFFERS_BIT            = 1 << 4 ;/* 0x00000010 */
#GDK_GL_DEPTH_BUFFER_BIT           = 1 << 5 ;/* 0x00000020 */
#GDK_GL_STENCIL_BUFFER_BIT         = 1 << 6 ;/* 0x00000040 */
#GDK_GL_ACCUM_BUFFER_BIT           = 1 << 7 ;/* 0x00000080 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLConfigError

#GDK_GL_BAD_SCREEN                 = 1 ;/* screen # is bad */
#GDK_GL_BAD_ATTRIBUTE              = 2 ;/* attribute To get is bad */
#GDK_GL_NO_EXTENSION               = 3 ;/* no glx extension on server */
#GDK_GL_BAD_VISUAL                 = 4 ;/* visual # Not known by GLX */
#GDK_GL_BAD_CONTEXT                = 5 ;/* returned only by import_context EXT? */
#GDK_GL_BAD_VALUE                  = 6 ;/* returned only by glXSwapIntervalSGI? */
#GDK_GL_BAD_ENUM                   = 7 ;/* unused? */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLRenderType

#GDK_GL_RGBA_TYPE                  = $8014
#GDK_GL_COLOR_INDEX_TYPE           = $8015

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLDrawableAttrib

#GDK_GL_PRESERVED_CONTENTS         = $801B
#GDK_GL_LARGEST_PBUFFER            = $801C
#GDK_GL_WIDTH                      = $801D
#GDK_GL_HEIGHT                     = $801E
#GDK_GL_EVENT_MASK                 = $801F

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLPbufferAttrib

#GDK_GL_PBUFFER_PRESERVED_CONTENTS = $801B ;/* GDK_GL_PRESERVED_CONTENTS */
#GDK_GL_PBUFFER_LARGEST_PBUFFER    = $801C ;/* GDK_GL_LARGEST_PBUFFER */
#GDK_GL_PBUFFER_HEIGHT             = $8040
#GDK_GL_PBUFFER_WIDTH              = $8041

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLEventMask

#GDK_GL_PBUFFER_CLOBBER_MASK       = 1 << 27 ;/* 0x08000000 */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLEventType

#GDK_GL_DAMAGED                    = $8020
#GDK_GL_SAVED                      = $8021

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLDrawableType

#GDK_GL_WINDOW                     = $8022
#GDK_GL_PBUFFER                    = $8023

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; GdkGLConfigMode

#GDK_GL_MODE_RGB         = 0
#GDK_GL_MODE_RGBA        = 0      ;/* same As RGB */
#GDK_GL_MODE_INDEX       = 1 << 0
#GDK_GL_MODE_SINGLE      = 0
#GDK_GL_MODE_DOUBLE      = 1 << 1
#GDK_GL_MODE_STEREO      = 1 << 2
#GDK_GL_MODE_ALPHA       = 1 << 3
#GDK_GL_MODE_DEPTH       = 1 << 4
#GDK_GL_MODE_STENCIL     = 1 << 5
#GDK_GL_MODE_ACCUM       = 1 << 6
#GDK_GL_MODE_MULTISAMPLE = 1 << 7  ;/* Not supported yet */

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;  GL.INC -- Part of the OpenGL32 API Includes for Purebasic 
;  Portions copyright Silicon Graphics and Microsoft. 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Copyright 1996 Silicon Graphics, Inc. 
; All Rights Reserved. 
; 
; This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; 
; the contents of this file may not be disclosed to third parties, copied or 
; duplicated in any form, in whole or in part, without the prior written 
; permission of Silicon Graphics, Inc. 
; 
; RESTRICTED RIGHTS LEGEND 
; Use, duplication or disclosure by the Government is subject to restrictions 
; as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data 
; and Computer Software clause at DFARS 252.227-7013, and/or in similar or 
; successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - 
; rights reserved under the Copyright Laws of the United States. 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#GL_INC                             = 1 

#GL_VERSION_1_1                     = 1 

#GL_ACCUM                           = $0100 
#GL_LOAD                            = $0101 
#GL_RETURN                          = $0102 
#GL_MULT                            = $0103 
#GL_ADD                             = $0104 

#GL_NEVER                           = $0200 
#GL_LESS                            = $0201 
#GL_EQUAL                           = $0202 
#GL_LEQUAL                          = $0203 
#GL_GREATER                         = $0204 
#GL_NOTEQUAL                        = $0205 
#GL_GEQUAL                          = $0206 
#GL_ALWAYS                          = $0207 

#GL_CURRENT_BIT                     = $00000001 
#GL_POINT_BIT                       = $00000002 
#GL_LINE_BIT                        = $00000004 
#GL_POLYGON_BIT                     = $00000008 
#GL_POLYGON_STIPPLE_BIT             = $00000010 
#GL_PIXEL_MODE_BIT                  = $00000020 
#GL_LIGHTING_BIT                    = $00000040 
#GL_FOG_BIT                         = $00000080 
#GL_DEPTH_BUFFER_BIT                = $00000100 
#GL_ACCUM_BUFFER_BIT                = $00000200 
#GL_STENCIL_BUFFER_BIT              = $00000400 
#GL_VIEWPORT_BIT                    = $00000800 
#GL_TRANSFORM_BIT                   = $00001000 
#GL_ENABLE_BIT                      = $00002000 
#GL_COLOR_BUFFER_BIT                = $00004000 
#GL_HINT_BIT                        = $00008000 
#GL_EVAL_BIT                        = $00010000 
#GL_LIST_BIT                        = $00020000 
#GL_TEXTURE_BIT                     = $00040000 
#GL_SCISSOR_BIT                     = $00080000 
#GL_ALL_ATTRIB_BITS                 = $000FFFFF 

#GL_POINTS                          = $0000 
#GL_LINES                           = $0001 
#GL_LINE_LOOP                       = $0002 
#GL_LINE_STRIP                      = $0003 
#GL_TRIANGLES                       = $0004 
#GL_TRIANGLE_STRIP                  = $0005 
#GL_TRIANGLE_FAN                    = $0006 
#GL_QUADS                           = $0007 
#GL_QUAD_STRIP                      = $0008 
#GL_POLYGON                         = $0009 

#GL_ZERO                            = 0 
#GL_ONE                             = 1 
#GL_SRC_COLOR                       = $0300 
#GL_ONE_MINUS_SRC_COLOR             = $0301 
#GL_SRC_ALPHA                       = $0302 
#GL_ONE_MINUS_SRC_ALPHA             = $0303 
#GL_DST_ALPHA                       = $0304 
#GL_ONE_MINUS_DST_ALPHA             = $0305 

#GL_DST_COLOR                       = $0306 
#GL_ONE_MINUS_DST_COLOR             = $0307 
#GL_SRC_ALPHA_SATURATE              = $0308 

#GL_TRUE                            = 1 
#GL_FALSE                           = 0 

#GL_CLIP_PLANE0                     = $3000 
#GL_CLIP_PLANE1                     = $3001 
#GL_CLIP_PLANE2                     = $3002 
#GL_CLIP_PLANE3                     = $3003 
#GL_CLIP_PLANE4                     = $3004 
#GL_CLIP_PLANE5                     = $3005 

#GL_BYTE                            = $1400 
#GL_UBYTE                           = $1401 
#GL_UNSIGNED_BYTE                   = $1401 
#GL_SHORT                           = $1402 
#GL_USHORT                          = $1403 
#GL_UNSIGNED_SHORT                  = $1403 
#GL_INT                             = $1404 
#GL_LONG                            = $1404 
#GL_UINT                            = $1405 
#GL_UNSIGNED_INT                    = $1405 
#GL_FLOAT                           = $1406 
#GL_2_BYTES                         = $1407 
#GL_3_BYTES                         = $1408 
#GL_4_BYTES                         = $1409 
#GL_DOUBLE                          = $140A 

#GL_NONE                            = 0 
#GL_FRONT_LEFT                      = $0400 
#GL_FRONT_RIGHT                     = $0401 
#GL_BACK_LEFT                       = $0402 
#GL_BACK_RIGHT                      = $0403 
#GL_FRONT                           = $0404 
#GL_BACK                            = $0405 
#GL_LEFT                            = $0406 
#GL_RIGHT                           = $0407 
#GL_FRONT_AND_BACK                  = $0408 
#GL_AUX0                            = $0409 
#GL_AUX1                            = $040A 
#GL_AUX2                            = $040B 
#GL_AUX3                            = $040C 

#GL_NO_ERROR                        = 0 
#GL_INVALID_ENUM                    = $0500 
#GL_INVALID_VALUE                   = $0501 
#GL_INVALID_OPERATION               = $0502 
#GL_STACK_OVERFLOW                  = $0503 
#GL_STACK_UNDERFLOW                 = $0504 
#GL_OUT_OF_MEMORY                   = $0505 

#GL_2D                              = $0600 
#GL_3D                              = $0601 
#GL_3D_COLOR                        = $0602 
#GL_3D_COLOR_TEXTURE                = $0603 
#GL_4D_COLOR_TEXTURE                = $0604 

#GL_PASS_THROUGH_TOKEN              = $0700 
#GL_POINT_TOKEN                     = $0701 
#GL_LINE_TOKEN                      = $0702 
#GL_POLYGON_TOKEN                   = $0703 
#GL_BITMAP_TOKEN                    = $0704 
#GL_DRAW_PIXEL_TOKEN                = $0705 
#GL_COPY_PIXEL_TOKEN                = $0706 
#GL_LINE_RESET_TOKEN                = $0707 

#GL_EXP                             = $0800 
#GL_EXP2                            = $0801 

#GL_CW                              = $0900 
#GL_CCW                             = $0901 

#GL_COEFF                           = $0A00 
#GL_ORDER                           = $0A01 
#GL_DOMAIN                          = $0A02 

#GL_CURRENT_COLOR                   = $0B00 
#GL_CURRENT_INDEX                   = $0B01 
#GL_CURRENT_NORMAL                  = $0B02 
#GL_CURRENT_TEXTURE_COORDS          = $0B03 
#GL_CURRENT_RASTER_COLOR            = $0B04 
#GL_CURRENT_RASTER_INDEX            = $0B05 
#GL_CURRENT_RASTER_TEXTURE_COORDS   = $0B06 
#GL_CURRENT_RASTER_POSITION         = $0B07 
#GL_CURRENT_RASTER_POSITION_VALID   = $0B08 
#GL_CURRENT_RASTER_DISTANCE         = $0B09 
#GL_POINT_SMOOTH                    = $0B10 
#GL_POINT_SIZE                      = $0B11 
#GL_POINT_SIZE_RANGE                = $0B12 
#GL_POINT_SIZE_GRANULARITY          = $0B13 
#GL_LINE_SMOOTH                     = $0B20 
#GL_LINE_WIDTH                      = $0B21 
#GL_LINE_WIDTH_RANGE                = $0B22 
#GL_LINE_WIDTH_GRANULARITY          = $0B23 
#GL_LINE_STIPPLE                    = $0B24 
#GL_LINE_STIPPLE_PATTERN            = $0B25 
#GL_LINE_STIPPLE_REPEAT             = $0B26 
#GL_LIST_MODE                       = $0B30 
#GL_MAX_LIST_NESTING                = $0B31 
#GL_LIST_BASE                       = $0B32 
#GL_LIST_INDEX                      = $0B33 
#GL_POLYGON_MODE                    = $0B40 
#GL_POLYGON_SMOOTH                  = $0B41 
#GL_POLYGON_STIPPLE                 = $0B42 
#GL_EDGE_FLAG                       = $0B43 
#GL_CULL_FACE                       = $0B44 
#GL_CULL_FACE_MODE                  = $0B45 
#GL_FRONT_FACE                      = $0B46 
#GL_LIGHTING                        = $0B50 
#GL_LIGHT_MODEL_LOCAL_VIEWER        = $0B51 
#GL_LIGHT_MODEL_TWO_SIDE            = $0B52 
#GL_LIGHT_MODEL_AMBIENT             = $0B53 
#GL_SHADE_MODEL                     = $0B54 
#GL_COLOR_MATERIAL_FACE             = $0B55 
#GL_COLOR_MATERIAL_PARAMETER        = $0B56 
#GL_COLOR_MATERIAL                  = $0B57 
#GL_FOG                             = $0B60 
#GL_FOG_INDEX                       = $0B61 
#GL_FOG_DENSITY                     = $0B62 
#GL_FOG_START                       = $0B63 
#GL_FOG_END                         = $0B64 
#GL_FOG_MODE                        = $0B65 
#GL_FOG_COLOR                       = $0B66 
#GL_DEPTH_RANGE                     = $0B70 
#GL_DEPTH_TEST                      = $0B71 
#GL_DEPTH_WRITEMASK                 = $0B72 
#GL_DEPTH_CLEAR_VALUE               = $0B73 
#GL_DEPTH_FUNC                      = $0B74 
#GL_ACCUM_CLEAR_VALUE               = $0B80 
#GL_STENCIL_TEST                    = $0B90 
#GL_STENCIL_CLEAR_VALUE             = $0B91 
#GL_STENCIL_FUNC                    = $0B92 
#GL_STENCIL_VALUE_MASK              = $0B93 
#GL_STENCIL_FAIL                    = $0B94 
#GL_STENCIL_PASS_DEPTH_FAIL         = $0B95 
#GL_STENCIL_PASS_DEPTH_PASS         = $0B96 
#GL_STENCIL_REF                     = $0B97 
#GL_STENCIL_WRITEMASK               = $0B98 
#GL_MATRIX_MODE                     = $0BA0 
#GL_NORMALIZE                       = $0BA1 
#GL_VIEWPORT                        = $0BA2 
#GL_MODELVIEW_STACK_DEPTH           = $0BA3 
#GL_PROJECTION_STACK_DEPTH          = $0BA4 
#GL_TEXTURE_STACK_DEPTH             = $0BA5 
#GL_MODELVIEW_MATRIX                = $0BA6 
#GL_PROJECTION_MATRIX               = $0BA7 
#GL_TEXTURE_MATRIX                  = $0BA8 
#GL_ATTRIB_STACK_DEPTH              = $0BB0 
#GL_CLIENT_ATTRIB_STACK_DEPTH       = $0BB1 
#GL_ALPHA_TEST                      = $0BC0 
#GL_ALPHA_TEST_FUNC                 = $0BC1 
#GL_ALPHA_TEST_REF                  = $0BC2 
#GL_DITHER                          = $0BD0 
#GL_BLEND_DST                       = $0BE0 
#GL_BLEND_SRC                       = $0BE1 
#GL_BLEND                           = $0BE2 
#GL_LOGIC_OP_MODE                   = $0BF0 
#GL_INDEX_LOGIC_OP                  = $0BF1 
#GL_COLOR_LOGIC_OP                  = $0BF2 
#GL_AUX_BUFFERS                     = $0C00 
#GL_DRAW_BUFFER                     = $0C01 
#GL_READ_BUFFER                     = $0C02 
#GL_SCISSOR_BOX                     = $0C10 
#GL_SCISSOR_TEST                    = $0C11 
#GL_INDEX_CLEAR_VALUE               = $0C20 
#GL_INDEX_WRITEMASK                 = $0C21 
#GL_COLOR_CLEAR_VALUE               = $0C22 
#GL_COLOR_WRITEMASK                 = $0C23 
#GL_INDEX_MODE                      = $0C30 
#GL_RGBA_MODE                       = $0C31 
#GL_DOUBLEBUFFER                    = $0C32 
#GL_STEREO                          = $0C33 
#GL_RENDER_MODE                     = $0C40 
#GL_PERSPECTIVE_CORRECTION_HINT     = $0C50 
#GL_POINT_SMOOTH_HINT               = $0C51 
#GL_LINE_SMOOTH_HINT                = $0C52 
#GL_POLYGON_SMOOTH_HINT             = $0C53 
#GL_FOG_HINT                        = $0C54 
#GL_TEXTURE_GEN_S                   = $0C60 
#GL_TEXTURE_GEN_T                   = $0C61 
#GL_TEXTURE_GEN_R                   = $0C62 
#GL_TEXTURE_GEN_Q                   = $0C63 
#GL_PIXEL_MAP_I_TO_I                = $0C70 
#GL_PIXEL_MAP_S_TO_S                = $0C71 
#GL_PIXEL_MAP_I_TO_R                = $0C72 
#GL_PIXEL_MAP_I_TO_G                = $0C73 
#GL_PIXEL_MAP_I_TO_B                = $0C74 
#GL_PIXEL_MAP_I_TO_A                = $0C75 
#GL_PIXEL_MAP_R_TO_R                = $0C76 
#GL_PIXEL_MAP_G_TO_G                = $0C77 
#GL_PIXEL_MAP_B_TO_B                = $0C78 
#GL_PIXEL_MAP_A_TO_A                = $0C79 
#GL_PIXEL_MAP_I_TO_I_SIZE           = $0CB0 
#GL_PIXEL_MAP_S_TO_S_SIZE           = $0CB1 
#GL_PIXEL_MAP_I_TO_R_SIZE           = $0CB2 
#GL_PIXEL_MAP_I_TO_G_SIZE           = $0CB3 
#GL_PIXEL_MAP_I_TO_B_SIZE           = $0CB4 
#GL_PIXEL_MAP_I_TO_A_SIZE           = $0CB5 
#GL_PIXEL_MAP_R_TO_R_SIZE           = $0CB6 
#GL_PIXEL_MAP_G_TO_G_SIZE           = $0CB7 
#GL_PIXEL_MAP_B_TO_B_SIZE           = $0CB8 
#GL_PIXEL_MAP_A_TO_A_SIZE           = $0CB9 
#GL_UNPACK_SWAP_BYTES               = $0CF0 
#GL_UNPACK_LSB_FIRST                = $0CF1 
#GL_UNPACK_ROW_LENGTH               = $0CF2 
#GL_UNPACK_SKIP_ROWS                = $0CF3 
#GL_UNPACK_SKIP_PIXELS              = $0CF4 
#GL_UNPACK_ALIGNMENT                = $0CF5 
#GL_PACK_SWAP_BYTES                 = $0D00 
#GL_PACK_LSB_FIRST                  = $0D01 
#GL_PACK_ROW_LENGTH                 = $0D02 
#GL_PACK_SKIP_ROWS                  = $0D03 
#GL_PACK_SKIP_PIXELS                = $0D04 
#GL_PACK_ALIGNMENT                  = $0D05 
#GL_MAP_COLOR                       = $0D10 
#GL_MAP_STENCIL                     = $0D11 
#GL_INDEX_SHIFT                     = $0D12 
#GL_INDEX_OFFSET                    = $0D13 
#GL_RED_SCALE                       = $0D14 
#GL_RED_BIAS                        = $0D15 
#GL_ZOOM_X                          = $0D16 
#GL_ZOOM_Y                          = $0D17 
#GL_GREEN_SCALE                     = $0D18 
#GL_GREEN_BIAS                      = $0D19 
#GL_BLUE_SCALE                      = $0D1A 
#GL_BLUE_BIAS                       = $0D1B 
#GL_ALPHA_SCALE                     = $0D1C 
#GL_ALPHA_BIAS                      = $0D1D 
#GL_DEPTH_SCALE                     = $0D1E 
#GL_DEPTH_BIAS                      = $0D1F 
#GL_MAX_EVAL_ORDER                  = $0D30 
#GL_MAX_LIGHTS                      = $0D31 
#GL_MAX_CLIP_PLANES                 = $0D32 
#GL_MAX_TEXTURE_SIZE                = $0D33 
#GL_MAX_PIXEL_MAP_TABLE             = $0D34 
#GL_MAX_ATTRIB_STACK_DEPTH          = $0D35 
#GL_MAX_MODELVIEW_STACK_DEPTH       = $0D36 
#GL_MAX_NAME_STACK_DEPTH            = $0D37 
#GL_MAX_PROJECTION_STACK_DEPTH      = $0D38 
#GL_MAX_TEXTURE_STACK_DEPTH         = $0D39 
#GL_MAX_VIEWPORT_DIMS               = $0D3A 
#GL_MAX_CLIENT_ATTRIB_STACK_DEPTH   = $0D3B 
#GL_SUBPIXEL_BITS                   = $0D50 
#GL_INDEX_BITS                      = $0D51 
#GL_RED_BITS                        = $0D52 
#GL_GREEN_BITS                      = $0D53 
#GL_BLUE_BITS                       = $0D54 
#GL_ALPHA_BITS                      = $0D55 
#GL_DEPTH_BITS                      = $0D56 
#GL_STENCIL_BITS                    = $0D57 
#GL_ACCUM_RED_BITS                  = $0D58 
#GL_ACCUM_GREEN_BITS                = $0D59 
#GL_ACCUM_BLUE_BITS                 = $0D5A 
#GL_ACCUM_ALPHA_BITS                = $0D5B 
#GL_NAME_STACK_DEPTH                = $0D70 
#GL_AUTO_NORMAL                     = $0D80 
#GL_MAP1_COLOR_4                    = $0D90 
#GL_MAP1_INDEX                      = $0D91 
#GL_MAP1_NORMAL                     = $0D92 
#GL_MAP1_TEXTURE_COORD_1            = $0D93 
#GL_MAP1_TEXTURE_COORD_2            = $0D94 
#GL_MAP1_TEXTURE_COORD_3            = $0D95 
#GL_MAP1_TEXTURE_COORD_4            = $0D96 
#GL_MAP1_VERTEX_3                   = $0D97 
#GL_MAP1_VERTEX_4                   = $0D98 
#GL_MAP2_COLOR_4                    = $0DB0 
#GL_MAP2_INDEX                      = $0DB1 
#GL_MAP2_NORMAL                     = $0DB2 
#GL_MAP2_TEXTURE_COORD_1            = $0DB3 
#GL_MAP2_TEXTURE_COORD_2            = $0DB4 
#GL_MAP2_TEXTURE_COORD_3            = $0DB5 
#GL_MAP2_TEXTURE_COORD_4            = $0DB6 
#GL_MAP2_VERTEX_3                   = $0DB7 
#GL_MAP2_VERTEX_4                   = $0DB8 
#GL_MAP1_GRID_DOMAIN                = $0DD0 
#GL_MAP1_GRID_SEGMENTS              = $0DD1 
#GL_MAP2_GRID_DOMAIN                = $0DD2 
#GL_MAP2_GRID_SEGMENTS              = $0DD3 
#GL_TEXTURE_1D                      = $0DE0 
#GL_TEXTURE_2D                      = $0DE1 
#GL_FEEDBACK_BUFFER_POINTER         = $0DF0 
#GL_FEEDBACK_BUFFER_SIZE            = $0DF1 
#GL_FEEDBACK_BUFFER_TYPE            = $0DF2 
#GL_SELECTION_BUFFER_POINTER        = $0DF3 
#GL_SELECTION_BUFFER_SIZE           = $0DF4 

#GL_TEXTURE_WIDTH                   = $1000 
#GL_TEXTURE_HEIGHT                  = $1001 
#GL_TEXTURE_INTERNAL_FORMAT         = $1003 
#GL_TEXTURE_BORDER_COLOR            = $1004 
#GL_TEXTURE_BORDER                  = $1005 

#GL_DONT_CARE                       = $1100 
#GL_FASTEST                         = $1101 
#GL_NICEST                          = $1102 

#GL_LIGHT0                          = $4000 
#GL_LIGHT1                          = $4001 
#GL_LIGHT2                          = $4002 
#GL_LIGHT3                          = $4003 
#GL_LIGHT4                          = $4004 
#GL_LIGHT5                          = $4005 
#GL_LIGHT6                          = $4006 
#GL_LIGHT7                          = $4007 

#GL_AMBIENT                         = $1200 
#GL_DIFFUSE                         = $1201 
#GL_SPECULAR                        = $1202 
#GL_POSITION                        = $1203 
#GL_SPOT_DIRECTION                  = $1204 
#GL_SPOT_EXPONENT                   = $1205 
#GL_SPOT_CUTOFF                     = $1206 
#GL_CONSTANT_ATTENUATION            = $1207 
#GL_LINEAR_ATTENUATION              = $1208 
#GL_QUADRATIC_ATTENUATION           = $1209 

#GL_COMPILE                         = $1300 
#GL_COMPILE_AND_EXECUTE             = $1301 

#GL_CLEAR                           = $1500 
#GL_AND                             = $1501 
#GL_AND_REVERSE                     = $1502 
#GL_COPY                            = $1503 
#GL_AND_INVERTED                    = $1504 
#GL_NOOP                            = $1505 
#GL_XOR                             = $1506 
#GL_OR                              = $1507 
#GL_NOR                             = $1508 
#GL_EQUIV                           = $1509 
#GL_INVERT                          = $150A 
#GL_OR_REVERSE                      = $150B 
#GL_COPY_INVERTED                   = $150C 
#GL_OR_INVERTED                     = $150D 
#GL_NAND                            = $150E 
#GL_SET                             = $150F 

#GL_EMISSION                        = $1600 
#GL_SHININESS                       = $1601 
#GL_AMBIENT_AND_DIFFUSE             = $1602 
#GL_COLOR_INDEXES                   = $1603 

#GL_MODELVIEW                       = $1700 
#GL_PROJECTION                      = $1701 
#GL_TEXTURE                         = $1702 

#GL_COLOR                           = $1800 
#GL_DEPTH                           = $1801 
#GL_STENCIL                         = $1802 

#GL_COLOR_INDEX                     = $1900 
#GL_STENCIL_INDEX                   = $1901 
#GL_DEPTH_COMPONENT                 = $1902 
#GL_RED                             = $1903 
#GL_GREEN                           = $1904 
#GL_BLUE                            = $1905 
#GL_ALPHA                           = $1906 
#GL_RGB                             = $1907 
#GL_RGBA                            = $1908 
#GL_LUMINANCE                       = $1909 
#GL_LUMINANCE_ALPHA                 = $190A 

#GL_BITMAP                          = $1A00 

#GL_POINT                           = $1B00 
#GL_LINE                            = $1B01 
#GL_FILL                            = $1B02 

#GL_RENDER                          = $1C00 
#GL_FEEDBACK                        = $1C01 
#GL_SELECT                          = $1C02 

#GL_FLAT                            = $1D00 
#GL_SMOOTH                          = $1D01 

#GL_KEEP                            = $1E00 
#GL_REPLACE                         = $1E01 
#GL_INCR                            = $1E02 
#GL_DECR                            = $1E03 

#GL_VENDOR                          = $1F00 
#GL_RENDERER                        = $1F01 
#GL_VERSION                         = $1F02 
#GL_EXTENSIONS                      = $1F03 

#GL_S                               = $2000 
#GL_T                               = $2001 
#GL_R                               = $2002 
#GL_Q                               = $2003 

#GL_MODULATE                        = $2100 
#GL_DECAL                           = $2101 

#GL_TEXTURE_ENV_MODE                = $2200 
#GL_TEXTURE_ENV_COLOR               = $2201 

#GL_TEXTURE_ENV                     = $2300 

#GL_EYE_LINEAR                      = $2400 
#GL_OBJECT_LINEAR                   = $2401 
#GL_SPHERE_MAP                      = $2402 

#GL_TEXTURE_GEN_MODE                = $2500 
#GL_OBJECT_PLANE                    = $2501 
#GL_EYE_PLANE                       = $2502 

#GL_NEAREST                         = $2600 
#GL_LINEAR                          = $2601 

#GL_NEAREST_MIPMAP_NEAREST          = $2700 
#GL_LINEAR_MIPMAP_NEAREST           = $2701 
#GL_NEAREST_MIPMAP_LINEAR           = $2702 
#GL_LINEAR_MIPMAP_LINEAR            = $2703 

#GL_TEXTURE_MAG_FILTER              = $2800 
#GL_TEXTURE_MIN_FILTER              = $2801 
#GL_TEXTURE_WRAP_S                  = $2802 
#GL_TEXTURE_WRAP_T                  = $2803 

#GL_CLAMP                           = $2900 
#GL_REPEAT                          = $2901 

#GL_CLIENT_PIXEL_STORE_BIT          = $00000001 
#GL_CLIENT_VERTEX_ARRAY_BIT         = $00000002 
#GL_CLIENT_ALL_ATTRIB_BITS          = $FFFFFFFF 

#GL_POLYGON_OFFSET_FACTOR           = $8038 
#GL_POLYGON_OFFSET_UNITS            = $2A00 
#GL_POLYGON_OFFSET_POINT            = $2A01 
#GL_POLYGON_OFFSET_LINE             = $2A02 
#GL_POLYGON_OFFSET_FILL             = $8037 

#GL_ALPHA4                          = $803B 
#GL_ALPHA8                          = $803C 
#GL_ALPHA12                         = $803D 
#GL_ALPHA16                         = $803E 
#GL_LUMINANCE4                      = $803F 
#GL_LUMINANCE8                      = $8040 
#GL_LUMINANCE12                     = $8041 
#GL_LUMINANCE16                     = $8042 
#GL_LUMINANCE4_ALPHA4               = $8043 
#GL_LUMINANCE6_ALPHA2               = $8044 
#GL_LUMINANCE8_ALPHA8               = $8045 
#GL_LUMINANCE12_ALPHA4              = $8046 
#GL_LUMINANCE12_ALPHA12             = $8047 
#GL_LUMINANCE16_ALPHA16             = $8048 
#GL_INTENSITY                       = $8049 
#GL_INTENSITY4                      = $804A 
#GL_INTENSITY8                      = $804B 
#GL_INTENSITY12                     = $804C 
#GL_INTENSITY16                     = $804D 
#GL_R3_G3_B2                        = $2A10 
#GL_RGB4                            = $804F 
#GL_RGB5                            = $8050 
#GL_RGB8                            = $8051 
#GL_RGB10                           = $8052 
#GL_RGB12                           = $8053 
#GL_RGB16                           = $8054 
#GL_RGBA2                           = $8055 
#GL_RGBA4                           = $8056 
#GL_RGB5_A1                         = $8057 
#GL_RGBA8                           = $8058 
#GL_RGB10_A2                        = $8059 
#GL_RGBA12                          = $805A 
#GL_RGBA16                          = $805B 
#GL_TEXTURE_RED_SIZE                = $805C 
#GL_TEXTURE_GREEN_SIZE              = $805D 
#GL_TEXTURE_BLUE_SIZE               = $805E 
#GL_TEXTURE_ALPHA_SIZE              = $805F 
#GL_TEXTURE_LUMINANCE_SIZE          = $8060 
#GL_TEXTURE_INTENSITY_SIZE          = $8061 
#GL_PROXY_TEXTURE_1D                = $8063 
#GL_PROXY_TEXTURE_2D                = $8064 

#GL_TEXTURE_PRIORITY                = $8066 
#GL_TEXTURE_RESIDENT                = $8067 
#GL_TEXTURE_BINDING_1D              = $8068 
#GL_TEXTURE_BINDING_2D              = $8069 

#GL_VERTEX_ARRAY                    = $8074 
#GL_NORMAL_ARRAY                    = $8075 
#GL_COLOR_ARRAY                     = $8076 
#GL_INDEX_ARRAY                     = $8077 
#GL_TEXTURE_COORD_ARRAY             = $8078 
#GL_EDGE_FLAG_ARRAY                 = $8079 
#GL_VERTEX_ARRAY_SIZE               = $807A 
#GL_VERTEX_ARRAY_TYPE               = $807B 
#GL_VERTEX_ARRAY_STRIDE             = $807C 
#GL_NORMAL_ARRAY_TYPE               = $807E 
#GL_NORMAL_ARRAY_STRIDE             = $807F 
#GL_COLOR_ARRAY_SIZE                = $8081 
#GL_COLOR_ARRAY_TYPE                = $8082 
#GL_COLOR_ARRAY_STRIDE              = $8083 
#GL_INDEX_ARRAY_TYPE                = $8085 
#GL_INDEX_ARRAY_STRIDE              = $8086 
#GL_TEXTURE_COORD_ARRAY_SIZE        = $8088 
#GL_TEXTURE_COORD_ARRAY_TYPE        = $8089 
#GL_TEXTURE_COORD_ARRAY_STRIDE      = $808A 
#GL_EDGE_FLAG_ARRAY_STRIDE          = $808C 
#GL_VERTEX_ARRAY_POINTER            = $808E 
#GL_NORMAL_ARRAY_POINTER            = $808F 
#GL_COLOR_ARRAY_POINTER             = $8090 
#GL_INDEX_ARRAY_POINTER             = $8091 
#GL_TEXTURE_COORD_ARRAY_POINTER     = $8092 
#GL_EDGE_FLAG_ARRAY_POINTER         = $8093 
#GL_V2F                             = $2A20 
#GL_V3F                             = $2A21 
#GL_C4UB_V2F                        = $2A22 
#GL_C4UB_V3F                        = $2A23 
#GL_C3F_V3F                         = $2A24 
#GL_N3F_V3F                         = $2A25 
#GL_C4F_N3F_V3F                     = $2A26 
#GL_T2F_V3F                         = $2A27 
#GL_T4F_V4F                         = $2A28 
#GL_T2F_C4UB_V3F                    = $2A29 
#GL_T2F_C3F_V3F                     = $2A2A 
#GL_T2F_N3F_V3F                     = $2A2B 
#GL_T2F_C4F_N3F_V3F                 = $2A2C 
#GL_T4F_C4F_N3F_V4F                 = $2A2D 

#GL_EXT_vertex_array                = 1 
#GL_EXT_bgra                        = 1 
#GL_EXT_paletted_texture            = 1 
#GL_WIN_swap_hint                   = 1 
#GL_WIN_draw_range_elements         = 1 

#GL_VERTEX_ARRAY_EXT                = $8074 
#GL_NORMAL_ARRAY_EXT                = $8075 
#GL_COLOR_ARRAY_EXT                 = $8076 
#GL_INDEX_ARRAY_EXT                 = $8077 
#GL_TEXTURE_COORD_ARRAY_EXT         = $8078 
#GL_EDGE_FLAG_ARRAY_EXT             = $8079 
#GL_VERTEX_ARRAY_SIZE_EXT           = $807A 
#GL_VERTEX_ARRAY_TYPE_EXT           = $807B 
#GL_VERTEX_ARRAY_STRIDE_EXT         = $807C 
#GL_VERTEX_ARRAY_COUNT_EXT          = $807D 
#GL_NORMAL_ARRAY_TYPE_EXT           = $807E 
#GL_NORMAL_ARRAY_STRIDE_EXT         = $807F 
#GL_NORMAL_ARRAY_COUNT_EXT          = $8080 
#GL_COLOR_ARRAY_SIZE_EXT            = $8081 
#GL_COLOR_ARRAY_TYPE_EXT            = $8082 
#GL_COLOR_ARRAY_STRIDE_EXT          = $8083 
#GL_COLOR_ARRAY_COUNT_EXT           = $8084 
#GL_INDEX_ARRAY_TYPE_EXT            = $8085 
#GL_INDEX_ARRAY_STRIDE_EXT          = $8086 
#GL_INDEX_ARRAY_COUNT_EXT           = $8087 
#GL_TEXTURE_COORD_ARRAY_SIZE_EXT    = $8088 
#GL_TEXTURE_COORD_ARRAY_TYPE_EXT    = $8089 
#GL_TEXTURE_COORD_ARRAY_STRIDE_EXT  = $808A 
#GL_TEXTURE_COORD_ARRAY_COUNT_EXT   = $808B 
#GL_EDGE_FLAG_ARRAY_STRIDE_EXT      = $808C 
#GL_EDGE_FLAG_ARRAY_COUNT_EXT       = $808D 
#GL_VERTEX_ARRAY_POINTER_EXT        = $808E 
#GL_NORMAL_ARRAY_POINTER_EXT        = $808F 
#GL_COLOR_ARRAY_POINTER_EXT         = $8090 
#GL_INDEX_ARRAY_POINTER_EXT         = $8091 
#GL_TEXTURE_COORD_ARRAY_POINTER_EXT = $8092 
#GL_EDGE_FLAG_ARRAY_POINTER_EXT     = $8093 
#GL_DOUBLE_EXT                      = #GL_DOUBLE 

#GL_BGR_EXT                         = $80E0 
#GL_BGRA_EXT                        = $80E1 

#GL_COLOR_TABLE_FORMAT_EXT          = $80D8 
#GL_COLOR_TABLE_WIDTH_EXT           = $80D9 
#GL_COLOR_TABLE_RED_SIZE_EXT        = $80DA 
#GL_COLOR_TABLE_GREEN_SIZE_EXT      = $80DB 
#GL_COLOR_TABLE_BLUE_SIZE_EXT       = $80DC 
#GL_COLOR_TABLE_ALPHA_SIZE_EXT      = $80DD 
#GL_COLOR_TABLE_LUMINANCE_SIZE_EXT  = $80DE 
#GL_COLOR_TABLE_INTENSITY_SIZE_EXT  = $80DF 

#GL_COLOR_INDEX1_EXT                = $80E2 
#GL_COLOR_INDEX2_EXT                = $80E3 
#GL_COLOR_INDEX4_EXT                = $80E4 
#GL_COLOR_INDEX8_EXT                = $80E5 
#GL_COLOR_INDEX12_EXT               = $80E6 
#GL_COLOR_INDEX16_EXT               = $80E7 

#GL_MAX_ELEMENTS_VERTICES_WIN       = $80E8 
#GL_MAX_ELEMENTS_INDICES_WIN        = $80E9 

#GL_PHONG_WIN                       = $80EA 
#GL_PHONG_HINT_WIN                  = $80EB 

#GL_FOG_SPECULAR_TEXTURE_WIN        = $80EC 

#GL_LOGIC_OP                        = #GL_INDEX_LOGIC_OP 
#GL_TEXTURE_COMPONENTS              = #GL_TEXTURE_INTERNAL_FORMAT 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; The OpenGL Architecture Review Board (ARB), was an independent consortium 
; formed in 1992, that governed the future of OpenGL, proposing And 
; approving changes To the specification, new releases, And conformance 
; testing. 
; 
; Constants definitions
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 

#GL_TEXTURE_CUBE_MAP_ARB            = $8513
#GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = $8515
#GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = $8516
#GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = $8517
#GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = $8518
#GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = $8519
#GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = $851A

#GL_ARRAY_BUFFER = $8892

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Miscaleneous Structures

Structure GdkGLContext
EndStructure 

Structure GdkGLConfig
EndStructure
; 
Structure GdkGLDrawable
EndStructure

Structure GdkGLPixmap
EndStructure 

Structure GdkGLWindow
EndStructure 

Structure GdkPixmap
EndStructure 

Structure GdkWindow
EndStructure 

Structure VisualID
EndStructure 

Structure PangoFontDescription
EndStructure 

Structure GLXContext  
EndStructure

Structure GtkGLAreaClass
EndStructure 

Structure GtkGLArea
  darea.GtkDrawingArea
  *glcontext.GdkGLContext
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Miscaleneous Library Import

ImportC "/usr/lib/libgtkgl-2.0.so" 
  
  gtk_gl_area_get_type()
  gtk_gl_area_new(*attrList)
  gtk_gl_area_share_new(*attrList,*share.GtkGLArea)
  gtk_gl_area_new_vargs(*share,*args)
  gtk_gl_area_make_current(*glarea.GtkGLArea)
  gtk_gl_area_swap_buffers(*glarea.GtkGLArea)
  gtk_widget_set_size_request(*glarea.GtkGLArea,width,height) 
  
EndImport  

ImportC "/usr/lib/libgtkglext-x11-1.0.so.0.0.0"
  
  ; /* Initialization */
  
  gdk_gl_init(*argc.l, *argv)
  gdk_gl_init_check(*argc.l, *argv)
  gdk_gl_parse_args(*argc.l, *argv)
  
  ; /* OpenGL-Capable Widget */
  
  gtk_widget_set_gl_capability(*widget.GtkWidget, *glconfig.GdkGLConfig, *share_list.GdkGLContext, direct.l, render_type.l)
  gtk_widget_is_gl_capable(*widget.GtkWidget)
  gtk_widget_get_gl_config(*widget.GtkWidget)
  gtk_widget_create_gl_context(*widget.GtkWidget, *share_list.GdkGLContext, direct.l, render_type.l)
  gtk_widget_get_gl_context(*widget.GtkWidget)
  gtk_widget_get_gl_window(*widget.GtkWidget)
  
EndImport 

ImportC "/usr/lib/libgdkglext-x11-1.0.so.0.0.0"

  ; /* Query */
  gdk_gl_query_extension()
  gdk_gl_query_extension_for_display(*display.GdkDisplay)
  gdk_gl_query_version(*major.l, *minor.l)
  gdk_gl_query_version_for_display(*display.GdkDisplay, *major.l, *minor.l)
  gdk_gl_query_gl_extension(*extension.Character)
  gdk_gl_get_proc_address(*proc_name.Character)

  ; /* Frame Buffer Configuration */
  
  gdk_gl_config_new(*attrib_list.l)
  gdk_gl_config_new_for_screen(*screen.GdkScreen, *attrib_list.l)
  gdk_gl_config_new_by_mode(mode.l)
  gdk_gl_config_new_by_mode_for_screen(*screen.GdkScreen, mode.l)
  gdk_gl_config_get_screen(*glconfig.GdkGLConfig)
  gdk_gl_config_get_attrib(*glconfig.GdkGLConfig, attribute.l, *value.l)
  gdk_gl_config_get_colormap(*glconfig.GdkGLConfig)
  gdk_gl_config_get_visual(*glconfig.GdkGLConfig)
  gdk_gl_config_get_depth(*glconfig.GdkGLConfig)
  gdk_gl_config_get_layer_plane(*glconfig.GdkGLConfig)
  gdk_gl_config_get_n_aux_buffers(*glconfig.GdkGLConfig)
  gdk_gl_config_get_n_sample_buffers(*glconfig.GdkGLConfig)
  gdk_gl_config_is_rgba(*glconfig.GdkGLConfig)
  gdk_gl_config_is_double_buffered(*glconfig.GdkGLConfig)
  gdk_gl_config_is_stereo(*glconfig.GdkGLConfig)
  gdk_gl_config_has_alpha(*glconfig.GdkGLConfig)
  gdk_gl_config_has_depth_buffer(*glconfig.GdkGLConfig)
  gdk_gl_config_has_stencil_buffer(*glconfig.GdkGLConfig)
  gdk_gl_config_has_accum_buffer(*glconfig.GdkGLConfig)
  
  ; /* Rendering Context */
  
  gdk_gl_context_new(*gldrawable.GdkGLDrawable, *share_list.GdkGLContext, direct.l, render_type.l)
  gdk_gl_context_destroy(*glcontext.GdkGLContext)
  gdk_gl_context_copy(*glcontext.GdkGLContext, *src.GdkGLContext, mask.l)
  gdk_gl_context_get_gl_drawable(*glcontext.GdkGLContext)
  gdk_gl_context_get_gl_config(*glcontext.GdkGLContext)
  gdk_gl_context_get_share_list(*glcontext.GdkGLContext)
  gdk_gl_context_is_direct(*glcontext.GdkGLContext)
  gdk_gl_context_get_render_type(*glcontext.GdkGLContext)
  gdk_gl_context_get_current()
  
  ; /* Rendering Surface */ 
  
  gdk_gl_drawable_make_current(*gldrawable.GdkGLDrawable, *glcontext.GdkGLContext)
  gdk_gl_drawable_is_double_buffered(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_swap_buffers(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_wait_gl(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_wait_gdk(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_gl_begin(*gldrawable.GdkGLDrawable, *glcontext.GdkGLContext)
  gdk_gl_drawable_gl_end(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_get_gl_config(*gldrawable.GdkGLDrawable)
  gdk_gl_drawable_get_size(*gldrawable.GdkGLDrawable, *width.l, *height.l)
  gdk_gl_drawable_get_current()
  
  ; /* OpenGL Pixmap */
  
  gdk_gl_pixmap_new(*glconfig.GdkGLConfig, *pixmap.GdkPixmap, *attrib_list.l)
  gdk_gl_pixmap_destroy(*pixmap.GdkPixmap)
  gdk_gl_pixmap_get_pixmap(*pixmap.GdkPixmap)
  gdk_gl_pixmap_ref(*glpixmap.GdkGLPixmap)
  gdk_gl_pixmap_unref(*glpixmap.GdkGLPixmap)
  gdk_gl_pixmap_make_current(*glpixmap.GdkGLPixmap, *context.GdkGLContext)
  gdk_pixmap_set_gl_capability(*pixmap.GdkPixmap, *glconfig.GdkGLConfig, *attrib_list.l)
  gdk_pixmap_unset_gl_capability(*pixmap.GdkPixmap)
  gdk_pixmap_is_gl_capable(*pixmap.GdkPixmap)
  
  ; /* OpenGL Window */
  
  gdk_gl_window_new(*glconfig.GdkGLConfig, *window.GdkWindow, *attrib_list.l)
  gdk_gl_window_destroy(*window.GdkWindow)
  gdk_gl_window_get_window(*window.GdkWindow)
  gdk_window_set_gl_capability(*window.GdkWindow, *glconfig.GdkGLConfig, *attrib_list.l)
  gdk_window_unset_gl_capability(*window.GdkWindow)
  gdk_window_is_gl_capable(*window.GdkWindow)
  gdk_window_get_gl_window(*window.GdkWindow)
  
  ; /* Font Rendering */
  
  gdk_gl_font_use_pango_font(*font_desc.PangoFontDescription, first.l, count.l, list_base.l)
  gdk_gl_font_use_pango_font_for_display(*display.GdkDisplay, *font_desc.PangoFontDescription, first.l, count.l, list_base.l)
  
  ; /* Geometric Object Rendering */
  
  gdk_gl_draw_cube(solid.l, size.d)
  gdk_gl_draw_sphere(solid.l,radius.d, slices.l, stacks.l)
  gdk_gl_draw_cone(solid.l, base.d, height.d, slices.l, stacks.l)
  gdk_gl_draw_torus(solid.l, inner_radius.d, outer_radius.d, nsides.l, rings.l)
  gdk_gl_draw_tetrahedron(solid.l)
  gdk_gl_draw_octahedron(solid.l)
  gdk_gl_draw_dodecahedron(solid.l)
  gdk_gl_draw_icosahedron(solid.l)
  gdk_gl_draw_teapot(solid.l, scale.d)
    
  ; /* Other commands */
  
  gdk_gl_query()
  gdk_gl_choose_visual(*attrList.l)
  gdk_gl_get_config(*visual.GdkVisual, attrib.l)

  gdk_gl_context_share_new(*visual.GdkVisual, *sharelist.GdkGLContext, direct.l)
  gdk_gl_context_ref(*context.GdkGLContext)
  gdk_gl_context_unref(*context.GdkGLContext)
  gdk_gl_make_current(*drawable.GdkDrawable, *context.GdkGLContext)
  gdk_gl_swap_buffers(*drawable.GdkDrawable)
  gdk_gl_wait_gdk()
  gdk_gl_wait_gl()
  
  ; /* fonts */
  
  gdk_gl_use_gdk_font(*font.GdkFont, first.l, count.l, list_base.l)
  
EndImport

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Importation des commandes depuis la lib OpenGL <<<<<

ImportC "-lGL" 
  
  glAccum(BufferOperation.l, Value.f) 
  glActiveTexture(Texture.l)
  glAlphaFunc(AlphaCompFunc.l, Ref.l)
  glArrayElement(Index.l)
  glAttachShader(Program.l, Shader.l)
 	
  glBegin(Mode.l)
  glBeginQuery(Target, Id.l)
  glBindAttribLocation(Program.l, Index.l, Name.s)
  glBindBuffer(Target.l, Buffer.l)
  glBindTexture(Target.l, TextureID.l)
  glBitmap(Width.l, Height.l, xorig.f, yorig.f, xmove.f, ymove.f, *bitmap.i) 
  glBlendColor(Red.f, Green.f, Blue.f, Alpha.f)
  glBlendEquation(Mode.l)
  glBlendEquationSeparate(ModeRGB.l, ModeAlpha.l)
  glBlendFunc(SourceFactor.l, DestinationFactor.l) 
  glBlendFuncSeparate(SrcRGB.l, DstRGB.l, SrcAlpha.l, DstAlpha.l)
  glBufferData(Target.l, size.i, *Data_.i, Usage.l)
  glBufferSubData(Target.l, Offset.l, Size.l, *Data_.i)
  
  glCallList(GL_List.l)
  glCallLists(n.l, Type.l, *lists.i)
  glClear(Mask.l) 
  glClearColor(Red.f, Green.f, Blue.f, Alpha.f) ; Values are clamped to the range [0,1].
  glColor3f(Red.f, Green.f, Blue.f)
  glColorMaterial(Face.l, Mode.l)
  glDisable(Capability.l)
  glEnable(Capability.l)
  glEnd()
  glHint(Target.l, Mode.l) 
  glLightfv(Light.l, Pname.l, *params.i)
  glLoadIdentity()
  glMatrixMode(Mode.l) 	
  glOrtho(Left.d, Right.d, Bottom.d, Top.d, Near.d, Far.d)
  glPopMatrix()
  glPopName()
  glPushMatrix()
  glRotatef(Angle.f, x.f, y.f, z.f)
  glScalef(x.f, y.f, z.f)
  glShadeModel(Mode.l) 
  glTranslatef(x.f, y.f, z.f)
  glVertex3f(x.f, y.f, z.f)
  glViewport(x.l, y.l, width.l, height.l) 

EndImport

Import "-lGLU"
  
  gluLookAt(EyeX.d,  EyeY.d, EyeZ.d, CenterX.d, CenterY.d, CenterZ.d, UpX.d, UpY.d,  UpZ.d)
  gluOrtho2D(Left.d, Right.d, Bottom.d, Top.d)
  gluPerspective(FovY.d, Aspect.d, zNear.d, zFar.d)
  
EndImport

Global ginit

Macro fillv(V,a,b,c,d)
  v(0) = a
  v(1) = b
  v(2) = c
  v(3) = d
EndMacro

Procedure glarea_init (*widget.GtkWidget)
  
  If gtk_gl_area_make_current(*widget)
    
    Global Dim light0_pos.f(4) 
    Global Dim light0_color.f(4)
    Global Dim light1_pos.f(4)
    Global Dim light1_color.f(4) 
    
    fillv(light0_pos,-50.0, 50.0, 0.0, 0.0)
    fillv(light0_color, 0.6, 0.6, 0.6, 1.0); /* white light */
    fillv(light1_pos,50.0, 50.0, 0.0, 0.0);
    fillv(light1_color,0.4, 0.4, 1.0, 1.0);  /* cold blue light */
    
    ;/* remove back faces */
    glDisable(#GL_CULL_FACE)
    glEnable(#GL_DEPTH_TEST)
    
    ;/* speedups */
    glEnable(#GL_DITHER);
    glShadeModel(#GL_SMOOTH)
    
    w = *widget\allocation\width
    h = *widget\allocation\height
    
    glMatrixMode(#GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, w/h, 0.1, 100000.0)
    glMatrixMode(#GL_MODELVIEW)
    
    glHint(#GL_PERSPECTIVE_CORRECTION_HINT, #GL_FASTEST)
    glHint(#GL_POLYGON_SMOOTH_HINT, #GL_FASTEST)
    
    ;/* light */
    glLightfv(#GL_LIGHT0, #GL_POSITION, @light0_pos)
    glLightfv(#GL_LIGHT0, #GL_DIFFUSE,  @light0_color)
    glLightfv(#GL_LIGHT1, #GL_POSITION, @light1_pos)
    glLightfv(#GL_LIGHT1, #GL_DIFFUSE,  @light1_color)
    glEnable(#GL_LIGHT0)
    glEnable(#GL_LIGHT1)
    glEnable(#GL_LIGHTING)
    
    glColorMaterial(#GL_FRONT_AND_BACK, #GL_AMBIENT_AND_DIFFUSE)
    glEnable(#GL_COLOR_MATERIAL)

    ginit = 1
    
  EndIf 
  
  ProcedureReturn 1
  
EndProcedure 

Procedure glarea_reshape(*widget.GtkWidget,*event.GdkEventConfigure)
  
  w = *widget\allocation\width
  h = *widget\allocation\height
  
  If gtk_gl_area_make_current(*widget)
    glViewport(0,0, w, h);
    glMatrixMode(#GL_PROJECTION);
    glLoadIdentity()
    ; gluPerspective(45.0,w/h,0.1,100.0)
    glMatrixMode(#GL_MODELVIEW);
    glLoadIdentity()
  EndIf 
  
  ProcedureReturn 1;
EndProcedure

Procedure glarea_draw(*widget.GtkWidget,*event.GdkEventExpose)
  Static rot.f
  
  If *event\count > 0
    ProcedureReturn 1
  EndIf 
  
  If gtk_gl_area_make_current(*widget)
    
    rot+0.1  
    glClear(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
    glClearColor(0,0,0,1);
    glLoadIdentity();                   // Reset The View
    glTranslatef(0,0,-0.25);             
    glRotatef(rot,0.0,1.0,0.0);             // Rotate The Pyramid On It's Y Axis
    
    glbegin(#GL_TRIANGLES)
    glColor3f(255,0.0,0.0);          // Red
    glVertex3f( 0.0, 1, 0.0);          // Top Of Triangle (Front)
    glColor3f(0.0,255,0.0);          // Green
    glVertex3f(-1,-1, 1);          // Left Of Triangle (Front)
    glColor3f(0.0,0.0,255);          // Blue
    glVertex3f( 1,-1, 1);          // Right Of Triangle (Front)
    
    glColor3f(255,0.0,0.0);          // Red
    glVertex3f( 0.0, 1, 0.0);          // Top Of Triangle (Right)
    glColor3f(0.0,0.0,255);          // Blue
    glVertex3f( 1,-1, 1);          // Left Of Triangle (Right)
    glColor3f(0.0,255,0.0);          // Green
    glVertex3f( 1,-1, -1);         // Right Of Triangle (Right)
    
    glColor3f(255,0.0,0.0);          // Red
    glVertex3f( 0.0, 255, 0.0);          // Top Of Triangle (Back)
    glColor3f(0.0,255,0.0);          // Green
    glVertex3f( 1,-1, -1);         // Left Of Triangle (Back)
    glColor3f(0.0,0.0,255);          // Blue
    glVertex3f(-1,-1, -1);         // Right Of Triangle (Back)
    
    glColor3f(255,0.0,0.0);          // Red
    glVertex3f( 0.0, 1, 0.0);          // Top Of Triangle (Left)
    glColor3f(0.0,0.0,255);          // Blue
    glVertex3f(-1,-1,-1);          // Left Of Triangle (Left)
    glColor3f(0.0,255,0.0);          // Green
    glVertex3f(-1,-1, 1);          // Right Of Triangle (Left)
    glEnd();                        // Done Drawing The Pyramid
    
    gtk_gl_area_swap_buffers(*widget);
    
    Debug StrF(rot, 3)
    
  EndIf 
  
  ProcedureReturn 1
  
EndProcedure 

Procedure GLAreaGadget(GadgetID, PosX.l, PosY.l, Width.l, Height.l) ; Notes : #PB_Any can't be used for GadgetID
  
  Dim ats(4) 
  
  ats(0) = #GDK_GL_RGBA 
  ats(1) = #GDK_GL_DOUBLEBUFFER 
  ats(2) = #GDK_GL_DEPTH_SIZE 
  ats(3) = 1 
  ats(4) = #GDK_NONE
    
  ContainerGadget(GadgetID, PosX, PosY, Width, Height, #PB_Container_Single)
    
    glarea = gtk_gl_area_new(@ats(0))
    SetGadgetData(GadgetID, glarea)
    gtk_widget_set_events_(glarea, #GDK_EXPOSURE_MASK|#GDK_BUTTON_PRESS_MASK|#GDK_BUTTON_RELEASE_MASK|#GDK_POINTER_MOTION_MASK|#GDK_POINTER_MOTION_HINT_MASK)
    g_signal_connect_(glarea,"realize", @glarea_init(), 0)
    g_signal_connect_(glarea,"expose_event", @glarea_draw(), 0)
    g_signal_connect_(glarea, "configure_event", @glarea_reshape(), 0)
    gtk_widget_set_usize_(glarea, Width, Height);
    gtk_container_add_(GadgetID(GadgetID), glarea);  ;need to attach it to something 
    
  CloseGadgetList()
  
  gtk_widget_show_(glarea)
  
EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "GLAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  

  GLAreaGadget(25, 5, 5, 790, 590)
  
  Repeat
    
    EventID = WaitWindowEvent()
    
    Select EventID
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
        EndSelect
        
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf 

; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
In theory we should see a spinning pyramid but the rotation variable is incremented only 2 times {0.100, 0.200} Idle think it's a problem with signal connection. Maybe a deep look in the GTK+ documentation is required.

Best regards.
Guimauve
User avatar
idle
Always Here
Always Here
Posts: 6026
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Gtk GL Extension

Post by idle »

That one's not running on my system it's getting an IMA at the procedurereturn in glarea_init()
GluPerspective is the culprit change to ImportC

I think the best way to achieve the render is to use timeout_add with the gl area canvas
and call gdk_window_invalidate_rect to redraw the widgets rect.

Once the canvas is wrapped it should be possible to use an idle signal to do the rendering
or set a timer but otherwise you can simply call the draw from the main loop

tack this on

Code: Select all

Macro fillv(V,a,b,c,d)
  v(0) = a
  v(1) = b
  v(2) = c
  v(3) = d
EndMacro

Declare glarea_draw (*widget.GtkWidget,*event.GdkEventExpose)
Procedure glarea_init (*widget.GtkWidget)
  
   If gtk_gl_area_make_current(*widget) 
  Global Dim light0_pos.f(4) 
  fillv(light0_pos,-50.0, 50.0, 0.0, 0.0);
  Global Dim light0_color.f(4)
  fillv(light0_color, 0.6, 0.6, 0.6, 1.0); /* white light */
  Global Dim light1_pos.f(4)
  fillv(light1_pos,50.0, 50.0, 0.0, 0.0);
  Global Dim light1_color.f(4) 
  fillv(light1_color,0.4, 0.4, 1.0, 1.0);  /* cold blue light */

  glEnable(#GL_DEPTH_TEST);
  glEnable(#GL_CULL_FACE)
  ;/* speedups */
  glEnable(#GL_DITHER);
  glShadeModel(#GL_SMOOTH);
  glHint(#GL_PERSPECTIVE_CORRECTION_HINT, #GL_FASTEST);
  glHint(#GL_POLYGON_SMOOTH_HINT, #GL_FASTEST);

  ;/* light */
  glLightfv(#GL_LIGHT0, #GL_POSITION, @light0_pos);
  glLightfv(#GL_LIGHT0, #GL_DIFFUSE,  @light0_color);
  glLightfv(#GL_LIGHT1, #GL_POSITION, @light1_pos);
  glLightfv(#GL_LIGHT1, #GL_DIFFUSE,  @light1_color);
  glEnable(#GL_LIGHT0);
  glEnable(#GL_LIGHT1);
  glEnable(#GL_LIGHTING);

  glColorMaterial(#GL_FRONT_AND_BACK,#GL_AMBIENT_AND_DIFFUSE);
  glEnable(#GL_COLOR_MATERIAL);
  
 
  
  ginit = 1
  
EndIf 
  
  ProcedureReturn 1

EndProcedure 

Procedure glarea_reshape(*widget.GtkWidget,*event.GdkEventConfigure)
 
  w =*widget\allocation\width;
  h = *widget\allocation\height;
  If gtk_gl_area_make_current(*widget)
    glMatrixMode(#GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, w/h, 0.1, 1000.0)
    glMatrixMode(#GL_MODELVIEW)
    glViewport(0,0, w,h);
     
  EndIf 
  ProcedureReturn 1;

EndProcedure

Procedure glarea_draw (*widget.GtkWidget,*event.GdkEventExpose)
  Static rot.f
   Static shp 
  If gtk_gl_area_make_current(*widget)
    
   rot+0.1  
  glClear(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
  glClearColor(0,0,0,1);
  glLoadIdentity();                   // Reset The View
  glTranslatef(0,0,-5);             
  glRotatef(rot,0.0,1.0,1.0);             // Rotate The Pyramid On It's Y Axis
    
  glbegin(#GL_TRIANGLES)
  glColor3f(255,0.0,0.0);          // Red
  glVertex3f( 0.0,1.0,0.0);          // Top Of Triangle (Front)
  glColor3f(0.0,255,0.0);          // Green
  glVertex3f(-1.0,-1.0, 1.0);          // Left Of Triangle (Front)
  glColor3f(0.0,0.0,255);          // Blue
  glVertex3f( 1.0,-1.0, 1.0);          // Right Of Triangle (Front)
   
  glColor3f(255,0.0,0.0);          // Red
  glVertex3f( 0.0, 1.0, 0.0);          // Top Of Triangle (Right)
  glColor3f(0.0,0.0,255);          // Blue
  glVertex3f( 1.0,-1.0, 1.0);          // Left Of Triangle (Right)
  glColor3f(0.0,255,0.0);          // Green
  glVertex3f( 1.0,-1.0, -1.0);         // Right Of Triangle (Right)
  
  glColor3f(255,0.0,0.0);          // Red
  glVertex3f( 0.0, 1.0,0.0);          // Top Of Triangle (Back)
  glColor3f(0.0,255,0.0);          // Green
  glVertex3f( 1.0,-1.0, -1.0);         // Left Of Triangle (Back)
  glColor3f(0.0,0.0,255);          // Blue
  glVertex3f(-1.0,-1.0, -1.0);         // Right Of Triangle (Back)

  glColor3f(255,0.0,0.0);          // Red
  glVertex3f( 0.0, 1.0, 0.0);          // Top Of Triangle (Left)
  glColor3f(0.0,0.0,255);          // Blue
  glVertex3f(-1.0,-1.0,-1.0);          // Left Of Triangle (Left)
  glColor3f(0.0,255,0.0);          // Green
  glVertex3f(-1.0,-1.0, 1.0);          // Right Of Triangle (Left)
  glEnd();                        // Done Drawing The Pyramid
  
  gtk_gl_area_swap_buffers(*widget);
  
  ;Debug "draw"
Else 
  Debug "fail"
EndIf 

 ProcedureReturn 1

EndProcedure 

Global glarea ,ctg,win

Procedure glarea_Create(x,y,w,h)
  Protected tglarea
  Dim ats(4) : ats(0)=#GDK_GL_RGBA : ats(1)=#GDK_GL_DOUBLEBUFFER : ats(2) = #GDK_GL_DEPTH_SIZE 
  ats(3) = 1 : ats(4) = #GDK_NONE
  ctg = ContainerGadget(#PB_Any,x,y,w,h)
  tglarea = gtk_gl_area_new(@ats(0))
  gtk_widget_set_events_(tglarea,#GDK_EXPOSURE_MASK|#GDK_BUTTON_PRESS_MASK|#GDK_BUTTON_RELEASE_MASK|#GDK_POINTER_MOTION_MASK|#GDK_POINTER_MOTION_HINT_MASK);
  g_signal_connect_(tglarea,"realize",@glarea_init(),0);
  g_signal_connect_(tglarea,"expose_event",@glarea_draw(),0);
  g_signal_connect_(tglarea, "configure_event",@glarea_reshape(),0)
  gtk_widget_set_usize_(tglarea,w,h);
  gtk_container_add_(GadgetID(ctg), tglarea);  ;need to attach it to something 
  CloseGadgetList()
  gtk_widget_show_(tglarea);
  ProcedureReturn tglarea   
EndProcedure   

If  OpenWindow(#PB_Any, 0, 0, 800, 600, "ContainerGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)  
;SetWindowCallback(@WinManCallBack(),0)
  
  glarea1 = glarea_Create(0,0,400,300)
  glarea2 = glarea_Create(400,0,400,300)
  glarea3= glarea_Create(0,300,400,300)
  glarea4 = glarea_Create(400,300,400,300)
  
  Repeat
    
    glarea_draw(glarea1,0)  
    glarea_draw(glarea2,0)
    glarea_draw(glarea3,0)  
    glarea_draw(glarea4,0)
    
    
    EventID = WaitWindowEvent(10)
    
    Select EventID
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
        EndSelect
        
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf 
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

Hello Idle,

Here on Linux Mint 12 x64 with PureBasic 4.60 x64 everything work fine. The next step put all of the GL Area in SplitterGadget().

Best regards
Guimauve
User avatar
idle
Always Here
Always Here
Posts: 6026
Joined: Fri Sep 21, 2007 5:52 am
Location: New Zealand

Re: Gtk GL Extension

Post by idle »

I was just trying it in a splitter but it doesn't resize it!
I added a configure signal to the container gadget though it never fired
but it should be possible to trap the splitter gadget firing a scroll so maybe it can be trapped in there

otherwise you'll want to use gtkHpanel and gtkVpanel and add the glarea directly to them

question for Fred or Freak What is PB's ContainerGadget is it a GTKFixed?
Windows 11, Manjaro, Raspberry Pi OS
Image
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

I'm just about to report the SplitterGadget() problem ...

Using the GtkHPaned and GtkVPaned to create 4 different views in one shot. Storing all information inside a Structure to control them later. (Locating / Orienting the camera, rendering the wireframe and or textured model , playing with projection to select Vertex, triangle or mesh, adding a grid snapping system and many other stuff)

Thanks for your time.

Best regards.
Guimauve
User avatar
Guimauve
Enthusiast
Enthusiast
Posts: 742
Joined: Wed Oct 22, 2003 2:51 am
Location: Canada

Re: Gtk GL Extension

Post by Guimauve »

Apparently Attaching the Gtk_GL_Area to the container gadget don't link them together. I have try to figure out if it's possible to Resize the Window and the gadgets. And it work !

Code: Select all

Global ginit

Macro fillv(V,a,b,c,d)
  v(0) = a
  v(1) = b
  v(2) = c
  v(3) = d
EndMacro

; Declare glarea_draw (*widget.GtkWidget,*event.GdkEventExpose)

Procedure glarea_init (*widget.GtkWidget)
  
  If gtk_gl_area_make_current(*widget) 
    
    Global Dim light0_pos.f(4) 
    Global Dim light0_color.f(4)
    Global Dim light1_pos.f(4)
    Global Dim light1_color.f(4) 
    
    fillv(light0_pos,-50.0, 50.0, 0.0, 0.0);
    fillv(light0_color, 0.1, 0.1, 0.1, 1.0); /* white light */
    fillv(light1_pos,50.0, 50.0, 0.0, 0.0);
    fillv(light1_color,0.4, 0.4, 1.0, 1.0);  /* cold blue light */
    
    glEnable(#GL_DEPTH_TEST);
    glEnable(#GL_CULL_FACE)
    ;/* speedups */
    glEnable(#GL_DITHER);
    glShadeModel(#GL_SMOOTH);
    glHint(#GL_PERSPECTIVE_CORRECTION_HINT, #GL_FASTEST);
    glHint(#GL_POLYGON_SMOOTH_HINT, #GL_FASTEST);
    
    ;/* light */
    glLightfv(#GL_LIGHT0, #GL_POSITION, @light0_pos);
    glLightfv(#GL_LIGHT0, #GL_DIFFUSE,  @light0_color);
    glLightfv(#GL_LIGHT1, #GL_POSITION, @light1_pos);
    glLightfv(#GL_LIGHT1, #GL_DIFFUSE,  @light1_color);
    glEnable(#GL_LIGHT0);
    glEnable(#GL_LIGHT1);
    glEnable(#GL_LIGHTING);
    
    glColorMaterial(#GL_FRONT_AND_BACK,#GL_AMBIENT_AND_DIFFUSE);
    glEnable(#GL_COLOR_MATERIAL)

    ginit = 1
    
  EndIf 
  
  ProcedureReturn 1
EndProcedure 

Procedure glarea_reshape(*widget.GtkWidget,*event.GdkEventConfigure)
 
  If gtk_gl_area_make_current(*widget)
    
    w = *widget\allocation\width
    h = *widget\allocation\height
    
    glViewport(0,0, w, h)
    glMatrixMode(#GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45.0, w/h, 0.1, 1000.0)
    glMatrixMode(#GL_MODELVIEW)

  EndIf 
  
  ProcedureReturn 1
EndProcedure

Procedure glarea_draw(*widget.GtkWidget,*event.GdkEventExpose)
  
  Static rot.f
  
  If gtk_gl_area_make_current(*widget)
    
    rot+0.1  
    glClear(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
    glClearColor(0,0,0,1);
    glLoadIdentity();                   // Reset The View
    glTranslatef(0,0,-5);             
    glRotatef(rot,0.0,1.0,1.0);             // Rotate The Pyramid On It's Y Axis
    
    glbegin(#GL_TRIANGLES)
    
      glColor3f(255,0.0,0.0);          // Red
      glVertex3f( 0.0,1.0,0.0);          // Top Of Triangle (Front)
      glColor3f(0.0,255,0.0);          // Green
      glVertex3f(-1.0,-1.0, 1.0);          // Left Of Triangle (Front)
      glColor3f(0.0,0.0,255);          // Blue
      glVertex3f( 1.0,-1.0, 1.0);          // Right Of Triangle (Front)
      
      glColor3f(255,0.0,0.0);          // Red
      glVertex3f( 0.0, 1.0, 0.0);          // Top Of Triangle (Right)
      glColor3f(0.0,0.0,255);          // Blue
      glVertex3f( 1.0,-1.0, 1.0);          // Left Of Triangle (Right)
      glColor3f(0.0,255,0.0);          // Green
      glVertex3f( 1.0,-1.0, -1.0);         // Right Of Triangle (Right)
      
      glColor3f(255,0.0,0.0);          // Red
      glVertex3f( 0.0, 1.0,0.0);          // Top Of Triangle (Back)
      glColor3f(0.0,255,0.0);          // Green
      glVertex3f( 1.0,-1.0, -1.0);         // Left Of Triangle (Back)
      glColor3f(0.0,0.0,255);          // Blue
      glVertex3f(-1.0,-1.0, -1.0);         // Right Of Triangle (Back)
      
      glColor3f(255,0.0,0.0);          // Red
      glVertex3f( 0.0, 1.0, 0.0);          // Top Of Triangle (Left)
      glColor3f(0.0,0.0,255);          // Blue
      glVertex3f(-1.0,-1.0,-1.0);          // Left Of Triangle (Left)
      glColor3f(0.0,255,0.0);          // Green
      glVertex3f(-1.0,-1.0, 1.0);          // Right Of Triangle (Left)
      
    glEnd();                        // Done Drawing The Pyramid
    
    gtk_gl_area_swap_buffers(*widget);

  EndIf 
  
  ProcedureReturn 1
EndProcedure 

Procedure GLAreaGadget(GadgetID, x,y,w,h)
  
  Dim ats(4) : ats(0)=#GDK_GL_RGBA : ats(1)=#GDK_GL_DOUBLEBUFFER : ats(2) = #GDK_GL_DEPTH_SIZE 
  ats(3) = 1 : ats(4) = #GDK_NONE
  
  ContainerGadget(GadgetID, x, y, w, h, #PB_Container_Single)
    gtk_gl_area = gtk_gl_area_new(@ats(0))
    gtk_widget_set_events_(gtk_gl_area,#GDK_EXPOSURE_MASK|#GDK_BUTTON_PRESS_MASK|#GDK_BUTTON_RELEASE_MASK|#GDK_POINTER_MOTION_MASK|#GDK_POINTER_MOTION_HINT_MASK)
    g_signal_connect_(gtk_gl_area, "realize", @glarea_init(), 0)
    g_signal_connect_(gtk_gl_area, "expose_event", @glarea_draw(), 0)
    g_signal_connect_(gtk_gl_area, "configure_event", @glarea_reshape(), 0)
    gtk_widget_set_usize_(gtk_gl_area, w, h)
    gtk_container_add_(GadgetID(GadgetID), gtk_gl_area);  ;need to attach it to something 
  CloseGadgetList()
  
  SetGadgetData(GadgetID, gtk_gl_area)
  
  gtk_widget_show_(gtk_gl_area)
  
  ProcedureReturn gtk_gl_area 
EndProcedure   

Macro GLAreaGadgetRedraw(GadgetID)
  
  glarea_draw(GetGadgetData(GadgetID), 0) 
  
EndMacro

Macro ResizeGLAreaGadget(GadgetID, x, y, Width, Height)
  
  ResizeGadget(GadgetID, x, y, Width, Height)
  gtk_widget_set_size_request(GetGadgetData(GadgetID), Width, Height) 
  glarea_reshape(GetGadgetData(GadgetID), 0)
  
EndMacro

Procedure ResizeGUI()
  
  Width = (WindowWidth(0) - 15) >> 1
  Height = (WindowHeight(0) - 15) >> 1  
  
  ResizeGLAreaGadget(0, #PB_Ignore, #PB_Ignore, Width, Height)
  ResizeGLAreaGadget(1, Width + 10, #PB_Ignore, Width, Height)  
  ResizeGLAreaGadget(2, #PB_Ignore, Height + 10, Width, Height)  
  ResizeGLAreaGadget(3, Width + 10, Height + 10, Width, Height)  

EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "GLAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)  
  
  GLAreaGadget(0, 5,5,390,290)
  GLAreaGadget(1, 400,5,390,290)
  GLAreaGadget(2, 5,300,390,290)
  GLAreaGadget(3, 400,300,390,290)
  
  Repeat

    GLAreaGadgetRedraw(0)
    GLAreaGadgetRedraw(1)
    GLAreaGadgetRedraw(2)
    GLAreaGadgetRedraw(3)

    EventID = WaitWindowEvent(5)
    
    Select EventID
        
      Case #PB_Event_Menu
        
        Select EventMenu()
            
        EndSelect
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
        EndSelect
        
      Case #PB_Event_SizeWindow
        ResizeGUI()
        
    EndSelect
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf 
Unfortunately, this code don't support the Unicode mode :?
In Unicode mode the g_signal_connect_() command complain about some characters are invalid or something like that.

Edit :
The gtk_gl_area ID is now stored inside the Container Gadget Data. The drawback, #PB_any can't be used anymore.

Best regards.
Guimauve
Last edited by Guimauve on Tue Jan 10, 2012 3:05 am, edited 1 time in total.
Post Reply