Skip to content

Commit

Permalink
Merge pull request #499 from cedlemo/sample_misc_gtkglarea1_rb
Browse files Browse the repository at this point in the history
Add sample script for the Gtk::GLArea widget

Patch by cedlemo. Thanks!!!
  • Loading branch information
kou committed Aug 11, 2015
2 parents 50f54a4 + 946edc9 commit 23b9d60
Showing 1 changed file with 123 additions and 0 deletions.
123 changes: 123 additions & 0 deletions gtk3/sample/misc/gtkglarea1.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
=begin
gtkglarea1.rb draw a triangle on a grey background
this script need the opengl-bindings gem from :
https://github.com/vaiorabbit/ruby-opengl
gem install opengl-bindings
sources:
http://antongerdelan.net/opengl/hellotriangle.html
opengl-bindings/sample/RedBook/varray
opengl-bindings/sample/GLES/gles.rb
http://www.opengl-tutorial.org/beginners-tutorials/tutorial-2-the-first-triangle/
https://developer.gnome.org/gtk3/stable/GtkGLArea.html
https://www.bassi.io/articles/2015/02/17/using-opengl-with-gtk/
http://stackoverflow.com/questions/30337845/gldrawarrays-not-working-using-gtkglarea-in-gtk3
http://gamedev.stackexchange.com/questions/8042/vertex-array-object-opengl
=end

require "gtk3"
require "opengl"

unless Gtk::Version.or_later?(3, 16, 0)
puts "This sample requires GTK+ 3.16.0 or later: #{Gtk::Version::STRING}"
exit
end

case OpenGL.get_platform
when :OPENGL_PLATFORM_WINDOWS
OpenGL.load_lib("opengl32.dll", "C:/Windows/System32")
when :OPENGL_PLATFORM_MACOSX
OpenGL.load_lib("libGL.dylib", "/System/Library/Frameworks/OpenGL.framework/Libraries")
when :OPENGL_PLATFORM_LINUX
OpenGL.load_lib
else
fail "Unsupported platform."
end

include OpenGL

window = Gtk::Window.new("OpenGL widget test")

window.set_size_request(400, 400)
glarea = Gtk::GLArea.new

window.add(glarea)

gl_vao = nil

glarea.signal_connect("realize") do |widget|

widget.make_current

# Check can only be done when we have an OpenGL context
# https://www.opengl.org/wiki/FAQ#What_is_an_OpenGL_context_and_why_do_you_need_a_window_to_do_GL_rendering.3F
# https://www.opengl.org/wiki/FAQ#How_do_I_tell_what_version_of_OpenGL_I.27m_using.3F

version = glGetString(GL_VERSION).to_s.split(" ").first.split(".").collect(&:to_i)
unless version[0] >= 3 && version[1] >= 2
puts "Gtk::GLArea widget require an OpenGL version >= 3.2, your version is #{version[0]}.#{version[1]}"
exit 1
end

puts "realize"
# Define a triangle in a vertex buffer ( Vertex Buffer Object)

points = [
0.0, 0.5, 0.0, # x1, y1, z1
0.5, -0.5, 0.0, # x2, y2, z2
-0.5, -0.5, 0.0 # x3, y3, z3
]
# Create a vertex array object (VAO) and "bind" it (set it as the current VAO)
vao_buf = " "
glGenVertexArrays(1, vao_buf)
gl_vao = vao_buf.unpack("L")[0]
glBindVertexArray(gl_vao)

# We copy points onto the graphics card in a unit called vertex buffer object (vbo).
# Create an empty buffer
vbo_buf = " "
glGenBuffers(1, vbo_buf)
g_vbo = vbo_buf.unpack("L")[0]
# Set the empty buffer as the current OpenGL's state machine by "binding"
glBindBuffer(GL_ARRAY_BUFFER, g_vbo)
# Copy the points in the currently bound buffer
glBufferData(GL_ARRAY_BUFFER,
3 * 4 * Fiddle::SIZEOF_FLOAT,
points.pack("F*"),
GL_STATIC_DRAW
)

# First attribute buffer : vertices
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, # No particular reason for 0
3, # size
GL_FLOAT, # type
GL_FALSE, # normalized?
0, # stride
0 # array buffer offset
)
# Clear the current VAO
glBindVertexArray(0)
end

glarea.signal_connect("render") do |_widget, _context|
puts "render"
glClearColor(0.3, 0.3, 0.3, 1)
glClear(GL_COLOR_BUFFER_BIT)
# Reload the VAO we created previously
glBindVertexArray(gl_vao)
glDrawArrays(GL_TRIANGLES, 0, 3)

# we completed our drawing; the draw commands will be
# flushed at the end of the signal emission chain, and
# the buffers will be drawn on the window
true # to stop other handlers from being invoked for the event.
# false to propagate the event further.
end

window.signal_connect("destroy") { Gtk.main_quit }

window.show_all

Gtk.main

0 comments on commit 23b9d60

Please sign in to comment.