module Rabbit::Renderer::GL

Public Instance Methods

draw_cone(filled, x, y, z, base, height, slices, stacks, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 40
def draw_cone(filled, x, y, z, base, height, slices, stacks,
              color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_cone(filled, base, height, slices, stacks)
  end
end
draw_cube(filled, x, y, z, size, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 25
def draw_cube(filled, x, y, z, size, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_cube(filled, size)
  end
end
draw_dodecahedron(filled, x, y, z, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 71
def draw_dodecahedron(filled, x, y, z, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_dodecahedron(filled)
  end
end
draw_icosahedron(filled, x, y, z, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 78
def draw_icosahedron(filled, x, y, z, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_icosahedron(filled)
  end
end
draw_octahedron(filled, x, y, z, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 64
def draw_octahedron(filled, x, y, z, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_octahedron(filled)
  end
end
draw_slide(slide, simulation, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 13
def draw_slide(slide, simulation, &block)
  if gl_available?
    gl_drawable.gl_begin(gl_context) do
      init_gl_drawing_info
      super(slide, simulation, &block)
      gl_drawable.swap_buffers if gl_drawable.double_buffered?
    end
  else
    super(slide, simulation, &block)
  end
end
draw_sphere(filled, x, y, z, radius, slices, stacks, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 32
def draw_sphere(filled, x, y, z, radius, slices, stacks,
                color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_sphere(filled, radius, slices, stacks)
  end
end
draw_teapot(filled, x, y, z, scale, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 85
def draw_teapot(filled, x, y, z, scale, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_teapot(filled, scale)
  end
end
draw_tetrahedron(filled, x, y, z, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 57
def draw_tetrahedron(filled, x, y, z, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_tetrahedron(filled)
  end
end
draw_torus(filled, x, y, z, inner_radius, outer_radius, n_sides, rings, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 48
def draw_torus(filled, x, y, z, inner_radius, outer_radius,
               n_sides, rings, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::Gdk::GL.draw_torus(filled, inner_radius,
                       outer_radius, n_sides, rings)
  end
end
gl_call_list(id, x, y, z, color=nil, &block) click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 99
def gl_call_list(id, x, y, z, color=nil, &block)
  return super unless gl_available?
  draw_gl(x, y, z, color, block) do
    ::GL.CallList(id)
  end
end
gl_compile(id) { || ... } click to toggle source
Calls superclass method
# File lib/rabbit/renderer/gl.rb, line 92
def gl_compile(id)
  return super unless gl_available?
  ::GL.NewList(id, ::GL::COMPILE)
  yield
  ::GL.EndList
end
gl_supported?() click to toggle source
# File lib/rabbit/renderer/gl.rb, line 106
def gl_supported?
  (Gtk::GL::BUILD_VERSION <=> [1, 2, 0]) >= 0
end

Private Instance Methods

draw_gl(x, y, z, color, block) { || ... } click to toggle source
# File lib/rabbit/renderer/gl.rb, line 138
def draw_gl(x, y, z, color, block)
  gl_drawable.wait_gdk
  ::GL.PushMatrix
  setup_geometry(x, y, z)
  setup_color(color)
  block.call(true) if block
  yield
  block.call(false) if block
  unless gl_drawable.double_buffered?
    ::GL.Flush
  end
  ::GL.PopMatrix
  gl_drawable.wait_gl
end
init_gl_drawing_info() click to toggle source
# File lib/rabbit/renderer/gl.rb, line 111
def init_gl_drawing_info
  gl_drawable.wait_gdk
  ::GL.ClearDepth(1.0)
  ::GL.Clear(::GL::DEPTH_BUFFER_BIT)

  ::GL.Viewport(0, 0, width, height)

  ::GL.Light(::GL::LIGHT0, ::GL::POSITION, [1.0, 1.0, 1.0, 0.0])
  ::GL.Enable(::GL::LIGHTING)
  ::GL.Enable(::GL::LIGHT0)
  ::GL.Enable(::GL::DEPTH_TEST)

  ::GL.MatrixMode(::GL::PROJECTION)
  ::GL.LoadIdentity
  GLU.Perspective(30.0, width / height, 1.0, z_far)

  ::GL.MatrixMode(::GL::MODELVIEW)
  ::GL.LoadIdentity
  GLU.LookAt(0.0, 0.0, z_view,
             0.0, 0.0, 0.0,
             0.0, 1.0, 0.0)
  ::GL.Translate(0.0, 0.0, -z_view)
  ::GL.Scale(gl_scale, gl_scale, gl_scale)
  ::GL.MultMatrix(gl_quaternion.build_rotmatrix)
  gl_drawable.wait_gl
end
setup_color(color) click to toggle source
# File lib/rabbit/renderer/gl.rb, line 153
def setup_color(color)
  color = make_color(color)
  ::GL.Light(::GL::LIGHT0, ::GL::DIFFUSE, color.to_a)
end
setup_geometry(x, y, z) click to toggle source
# File lib/rabbit/renderer/gl.rb, line 158
def setup_geometry(x, y, z)
  new_x = to_gl_size(x, width)
  new_y = to_gl_size(height - y, height)
  new_z = z
  ::GL.MatrixMode(::GL::MODELVIEW)
  ::GL.Translate(new_x, new_y, new_z)
end
to_gl_size(value, max) click to toggle source
# File lib/rabbit/renderer/gl.rb, line 166
def to_gl_size(value, max)
  min = 0.0
  range = min.abs + max.abs
  gl_min = -1.0
  gl_max = 1.0
  gl_range = gl_min.abs + gl_max.abs
  (value / range.to_f) * gl_range + gl_min
end