Sophie

Sophie

distrib > Mandriva > 2008.1 > x86_64 > media > main-release > by-pkgid > 4ad29f379a112f11450da00f53c49a42 > files > 11

ruby-gtkglext-0.16.0-4mdv2008.1.x86_64.rpm

#
# simple-mixed.rb:
# Simple GtkGLExt example for mixing OpenGL and GDK rendering.
#
# C original version written by Naofumi Yasufuku <naofumi@users.sourceforge.net>
# Ruby port by Vincent Isambart
#

require 'gtkglext'

def examine_gl_config_attrib(glconfig)
    puts "\nOpenGL visual configurations :\n\n"

    [
      :rgba?, :double_buffered?, :stereo?, :has_alpha?, :has_depth_buffer?,
      :has_stencil_buffer?, :has_accum_buffer?
    ].each { |id| puts "glconfig.#{id} = #{glconfig.send(id)}\n" }

    puts "\n"

    [
      :USE_GL, :BUFFER_SIZE, :LEVEL, :RGBA, :DOUBLEBUFFER, :STEREO, :AUX_BUFFERS,
      :RED_SIZE, :GREEN_SIZE, :BLUE_SIZE, :ALPHA_SIZE, :DEPTH_SIZE, :STENCIL_SIZE,
      :ACCUM_RED_SIZE, :ACCUM_GREEN_SIZE, :ACCUM_BLUE_SIZE, :ACCUM_ALPHA_SIZE
    ].each do |id|
        val = glconfig.get_attrib(Gdk::GLConfig.const_get(id))
        if val == nil
            puts "*** Cannot get Gdk::GLConfig::#{id} attribute value\n"
        else
            puts "Gdk::GLConfig::#{id} = #{val}\n"
        end
    end

    puts "\n"
end

LIGHT_DIFFUSE  = [1.0, 0.0, 0.0, 1.0]
LIGHT_POSITION = [1.0, 1.0, 1.0, 0.0]
def realize(w)
    glcontext = w.gl_context
    gldrawable = w.gl_drawable

    gldrawable.gl_begin(glcontext) do
        qobj = GLU.NewQuadric
        GLU.QuadricDrawStyle(qobj, GLU::FILL)
        GL.NewList(1, GL::COMPILE)
        GLU.Sphere(qobj, 1.0, 20, 20)
        GL.EndList

        GL.Light(GL::LIGHT0, GL::DIFFUSE, LIGHT_DIFFUSE)
        GL.Light(GL::LIGHT0, GL::POSITION, LIGHT_POSITION)
        GL.Enable(GL::LIGHTING)
        GL.Enable(GL::LIGHT0)
        GL.Enable(GL::DEPTH_TEST)

        GL.ClearColor(1.0, 1.0, 1.0, 1.0)
        GL.ClearDepth(1.0)

        GL.Viewport(0, 0, w.allocation.width, w.allocation.height)

        GL.MatrixMode(GL::PROJECTION)
        GL.LoadIdentity
        GLU.Perspective(40.0, 1.0, 1.0, 10.0)

        GL.MatrixMode(GL::MODELVIEW)
        GL.LoadIdentity
        GLU.LookAt(0.0, 0.0, 3.0,
                   0.0, 0.0, 0.0,
                   0.0, 1.0, 0.0)
        GL.Translate(0.0, 0.0, -3.0)
    end
end

# Init GtkGlExt
Gtk::GL.init
# Query OpenGL extension version
major, minor = Gdk::GL.query_version
puts "\nOpenGL extension version - #{major}.#{minor}\n"

# Configure OpenGL-capable visual
# Try single-buffered visual
glconfig = Gdk::GLConfig.new(Gdk::GLConfig::MODE_RGB |
                             Gdk::GLConfig::MODE_DEPTH)
if !glconfig
    puts "*** No appropriate OpenGL-capable visual found.\n"
    exit 1
end

examine_gl_config_attrib(glconfig)

# Top-level window
window = Gtk::Window.new
window.title = "simple"
# Perform the resize immediately
window.resize_mode = Gtk::RESIZE_IMMEDIATE
# Get automatically redrawn if any of their children changed allocation.
window.reallocate_redraws = true
window.signal_connect("delete_event") do
    Gtk.main_quit
    true
end

# VBox
vbox = Gtk::VBox.new
window.add(vbox)
vbox.show

# Drawing area for drawing OpenGL scene
drawing_area = Gtk::DrawingArea.new
drawing_area.set_size_request(200, 200)
# Set OpenGL-capability to the widget
drawing_area.set_gl_capability(glconfig)

drawing_area.signal_connect_after("realize") { |w| realize(w) }
drawing_area.signal_connect("configure_event") do |w, e|
    glcontext = w.gl_context
    gldrawable = w.gl_drawable

    gldrawable.gl_begin(glcontext) do
        GL.Viewport(0, 0, w.allocation.width, w.allocation.height)
        true
    end
end
drawing_area.signal_connect("expose_event") do |w,e|
    glcontext = w.gl_context
    gldrawable = w.gl_drawable

    gldrawable.gl_begin(glcontext) do
        GL.Clear(GL::COLOR_BUFFER_BIT | GL::DEPTH_BUFFER_BIT)

        # Sync.
        gldrawable.wait_gl

        # GDK renderingfg_gc(w.state),
        gldrawable.draw_rectangle(w.style.fg_gc(w.state),
                                  true,
                                  w.allocation.width/10,
                                  w.allocation.height/10,
                                  w.allocation.width*8/10,
                                  w.allocation.height*8/10)

        # Sync.
        gldrawable.wait_gdk

        GL.CallList(1)

        GL.Flush
        true
    end
end

vbox.pack_start(drawing_area)
drawing_area.show

# Simple quit button
button = Gtk::Button.new("Quit")
button.signal_connect("clicked") do
    Gtk.main_quit
end
vbox.pack_start(button, false, false)
button.show

# Show window
window.show

# Main loop
Gtk.main