lib/sgl/opengl-event.rb in sgl-0.4.0 vs lib/sgl/opengl-event.rb in sgl-1.0.0
- old
+ new
@@ -1,325 +1,325 @@
-# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
-# License: Ruby License
-
-module SGL
- # callback functions
- def setup() end
- def onMouseDown(x,y) end
- def onMouseUp(x,y) end
- def onKeyDown(k) end
- def onKeyUp(k) end
- def display() end
-
- # callback functions for fullscreen
- def onMouseDown0(x,y) end
- def display0() end
-
- # mainloop
- def mainloop
- $__a__.set_setup { setup }
- $__a__.set_mousedown {|x, y| onMouseDown(x, y) }
- $__a__.set_mouseup {|x, y| onMouseUp(x, y) }
- $__a__.set_keydown {|k| onKeyDown(k) }
- $__a__.set_keyup {|k| onKeyUp(k) }
- if ! $__a__.check_display0
- $__a__.set_display0 { display0 }
- $__a__.set_mousedown0 {|x, y| onMouseDown0(x, y) }
- end
- $__a__.set_display { display }
-
- if ! defined?($__sgl_in_mainloop__)
- $__sgl_in_mainloop__ = true
- $__a__.mainloop
- else
- # do setup only.
- $__a__.mainloop_setup
-
- # for debug
- # $__a__.mainloop
- end
- end
-
- # novice mode
- def flip(*a) $__a__.flip(*a) end
- def wait(*a) $__a__.wait(*a) end
- def process(&b) $__a__.process(&b) end
-
- # get status functions
- def mouseX() $__a__.mouseX; end
- def mouseY() $__a__.mouseY; end
- def mouseDown() $__a__.mouseDown; end
- def key(k) $__a__.key[k]; end
- def keynum() $__a__.keynum; end
-
- # get status functions for fullscreen
- def mouseX0() $__a__.mouseX0; end
- def mouseY0() $__a__.mouseY0; end
-
- # event control
- def useDelay(*a) $__a__.useDelay(*a) end
- def useFramerate(*a) $__a__.useFramerate(*a) end
- def useRuntime(*a) $__a__.useRuntime(*a) end
-
- class Application
- def initialize_event
- @setup_done = nil
- @display_drawing = nil
- @block = {}
-
- # status setting
- @mouseX, @mouseY = 0, 0
- @mouseX0, @mouseY0 = 0, 0
- @mouseDown = 0
- @keynum = 0
-
- @starttime = nil
- end
- private :initialize_event
-
- # get status
- attr_reader :mouseX, :mouseY
- attr_reader :mouseX0, :mouseY0
- attr_reader :mouseDown
- attr_reader :keynum
-
- # setup
- def set_setup(&b)
- return unless block_given?
- @block[:setup] = Proc.new
- end
-
- def setup_pre
- # do nothing
- end
-
- def do_setup
- setup_pre
- @block[:setup].call if @block[:setup]
- setup_post
- end
-
- def setup_post
- @setup_done = true
- end
- private :setup_pre, :setup_post
-
- # display
- def set_display(&b)
- return unless block_given?
- @block[:display] = Proc.new
- end
-
- def set_display0(&b)
- return unless block_given?
- @block[:display0] = Proc.new
- end
-
- def check_display0
- return ! @block[:display0].nil?
- end
-
- def display_pre
- set_camera_position
- check_event
- clear
- end
-
- def do_display # callback
- return if @setup_done.nil?
-# return if @display_drawing
- @display_drawing = true
- display_pre
- @block[:display].call if @block[:display]
- display_post
- @display_drawing = nil
- end
-
- def display_post
- set_fullscreen_camera_position
- cur_color = @cur_color
- @block[:display0].call if @block[:display0]
- color(*cur_color)
- SDL.GLSwapBuffers
- #GC.start
- end
- private :display_pre, :display_post
-
- # mouse events
- def set_mousedown(&b)
- return unless block_given?
- @block[:mousedown] = Proc.new
- end
-
- def do_mousedown
- @mouseDown = 1
- @block[:mousedown].call(@mouseX, @mouseY) if @block[:mousedown]
- @block[:mousedown0].call(@mouseX0, @mouseY0) if @block[:mousedown0]
- end
-
- def set_mouseup(&b)
- return unless block_given?
- @block[:mouseup] = Proc.new
- end
-
- def do_mouseup
- @mouseDown = 0
- @block[:mouseup].call(@mouseX, @mouseY) if @block[:mouseup]
- end
-
- # mouse events for fullscreen
- def set_mousedown0(&b)
- return unless block_given?
- @block[:mousedown0] = Proc.new
- end
-
- def check_mousedown0
- return ! @block[:mousedown0].nil?
- end
-
- # key events
- def set_keydown(&b)
- return unless block_given?
- @block[:keydown] = Proc.new
- end
-
- def keydown_pre(key)
- exit if key == SDL::Key::ESCAPE
- end
- private :keydown_pre
-
- def do_keydown(key)
- keydown_pre(key)
- @block[:keydown].call(key) if @block[:keydown]
- end
-
- def set_keyup(&b)
- return unless block_given?
- @block[:keyup] = Proc.new
- end
-
- def do_keyup(key)
- @block[:keyup].call(key) if @block[:keyup]
- end
-
- def calc_keynum(e)
- input = e.characters
- @keynum = input.to_s[0]
- end
- private :calc_keynum
-
- def mainloop_setup
- do_setup
- end
-
- def mainloop
- mainloop_setup
- @starttime = Time.now
- loop {
- @begintime = Time.now
- do_display
- delay
- return if check_runtime_finished(@starttime)
- }
- end
-
- def delay
- if @options[:framerate]
- sec_per_frame = 1.0 / @options[:framerate]
- diff = sec_per_frame - (Time.now - @begintime)
- sleep(diff) if 0 < diff
- else
- delaytime = @options[:delaytime]
- sleep(delaytime)
- end
- end
- private :delay
-
- def check_runtime_finished(starttime)
- runtime = @options[:runtime]
- return false if runtime.nil?
- diff = Time.now - starttime
- return (runtime && runtime < diff)
- end
- private :check_runtime_finished
-
- # novice mode
- def flip
- @starttime = Time.now if @starttime.nil?
- display_post
- delay
- display_pre
- #exit if check_runtime_finished(@starttime)
- end
-
- def wait
- #SGL.flip if !$__v__.flipped
- loop {
- check_event
- delay
- return if check_runtime_finished(@starttime)
- }
- end
-
- def process(&b)
- block = Proc.new
- @starttime = Time.now
- loop {
- check_event
- block.call
- #yield
- delay
- return if check_runtime_finished(@starttime)
- }
- end
-
- # check event
- def check_event
- x, y, l, m, r = SDL::Mouse.state
- # x pos, y pos, left button, middle button, right button
- @mouseX, @mouseY = calc_mouse_xy(x, y)
- @mouseX0, @mouseY0 = calc_fullscreen_mouse_xy(x, y)
- event = @sdl_event
- while event.poll != 0
- case event.type
- when SDL::Event::MOUSEBUTTONDOWN
- do_mousedown
- when SDL::Event::MOUSEBUTTONUP
- do_mouseup
- when SDL::Event::KEYDOWN
- @keynum = event.info[2]
- do_keydown(@keynum)
- when SDL::Event::KEYUP
- @keynum = event.info[2]
- do_keyup(@keynum)
- when SDL::Event::QUIT
- exit
- end
- end
- end
-
- def calc_mouse_xy(x, y)
- if @options[:fullscreen]
- w, h = @options[:fullscreen]
- mx = @cameraX - (w / 2) + x
- my = @cameraY - (h / 2) + (h - y)
- else
- mx = @left + x
- my = @bottom + (@height - y)
- end
- return [mx, my]
- end
-
- def calc_fullscreen_mouse_xy(x, y)
- if @options[:fullscreen]
- w, h = @options[:fullscreen]
- mx = - (w / 2) + x
- my = - (h / 2) + (h - y)
- else
- mx = @left + x
- my = @bottom + (@height - y)
- end
- return [mx, my]
- end
- private :check_event, :calc_mouse_xy, :calc_fullscreen_mouse_xy
- end
-end
+# Copyright (C) 2004-2007 Kouichirou Eto, All rights reserved.
+# License: Ruby License
+
+module SGL
+ # callback functions
+ def setup() end
+ def onMouseDown(x,y) end
+ def onMouseUp(x,y) end
+ def onKeyDown(k) end
+ def onKeyUp(k) end
+ def display() end
+
+ # callback functions for fullscreen
+ def onMouseDown0(x,y) end
+ def display0() end
+
+ # mainloop
+ def mainloop
+ $__a__.set_setup { setup }
+ $__a__.set_mousedown {|x, y| onMouseDown(x, y) }
+ $__a__.set_mouseup {|x, y| onMouseUp(x, y) }
+ $__a__.set_keydown {|k| onKeyDown(k) }
+ $__a__.set_keyup {|k| onKeyUp(k) }
+ if ! $__a__.check_display0
+ $__a__.set_display0 { display0 }
+ $__a__.set_mousedown0 {|x, y| onMouseDown0(x, y) }
+ end
+ $__a__.set_display { display }
+
+ if ! defined?($__sgl_in_mainloop__)
+ $__sgl_in_mainloop__ = true
+ $__a__.mainloop
+ else
+ # do setup only.
+ $__a__.mainloop_setup
+
+ # for debug
+ # $__a__.mainloop
+ end
+ end
+
+ # novice mode
+ def flip(*a) $__a__.flip(*a) end
+ def wait(*a) $__a__.wait(*a) end
+ def process(&b) $__a__.process(&b) end
+
+ # get status functions
+ def mouseX() $__a__.mouseX; end
+ def mouseY() $__a__.mouseY; end
+ def mouseDown() $__a__.mouseDown; end
+ def key(k) $__a__.key[k]; end
+ def keynum() $__a__.keynum; end
+
+ # get status functions for fullscreen
+ def mouseX0() $__a__.mouseX0; end
+ def mouseY0() $__a__.mouseY0; end
+
+ # event control
+ def useDelay(*a) $__a__.useDelay(*a) end
+ def useFramerate(*a) $__a__.useFramerate(*a) end
+ def useRuntime(*a) $__a__.useRuntime(*a) end
+
+ class Application
+ def initialize_event
+ @setup_done = nil
+ @display_drawing = nil
+ @block = {}
+
+ # status setting
+ @mouseX, @mouseY = 0, 0
+ @mouseX0, @mouseY0 = 0, 0
+ @mouseDown = 0
+ @keynum = 0
+
+ @starttime = nil
+ end
+ private :initialize_event
+
+ # get status
+ attr_reader :mouseX, :mouseY
+ attr_reader :mouseX0, :mouseY0
+ attr_reader :mouseDown
+ attr_reader :keynum
+
+ # setup
+ def set_setup(&b)
+ return unless block_given?
+ @block[:setup] = Proc.new
+ end
+
+ def setup_pre
+ # do nothing
+ end
+
+ def do_setup
+ setup_pre
+ @block[:setup].call if @block[:setup]
+ setup_post
+ end
+
+ def setup_post
+ @setup_done = true
+ end
+ private :setup_pre, :setup_post
+
+ # display
+ def set_display(&b)
+ return unless block_given?
+ @block[:display] = Proc.new
+ end
+
+ def set_display0(&b)
+ return unless block_given?
+ @block[:display0] = Proc.new
+ end
+
+ def check_display0
+ return ! @block[:display0].nil?
+ end
+
+ def display_pre
+ set_camera_position
+ check_event
+ clear
+ end
+
+ def do_display # callback
+ return if @setup_done.nil?
+# return if @display_drawing
+ @display_drawing = true
+ display_pre
+ @block[:display].call if @block[:display]
+ display_post
+ @display_drawing = nil
+ end
+
+ def display_post
+ set_fullscreen_camera_position
+ cur_color = @cur_color
+ @block[:display0].call if @block[:display0]
+ color(*cur_color)
+ SDL.GLSwapBuffers
+ #GC.start
+ end
+ private :display_pre, :display_post
+
+ # mouse events
+ def set_mousedown(&b)
+ return unless block_given?
+ @block[:mousedown] = Proc.new
+ end
+
+ def do_mousedown
+ @mouseDown = 1
+ @block[:mousedown].call(@mouseX, @mouseY) if @block[:mousedown]
+ @block[:mousedown0].call(@mouseX0, @mouseY0) if @block[:mousedown0]
+ end
+
+ def set_mouseup(&b)
+ return unless block_given?
+ @block[:mouseup] = Proc.new
+ end
+
+ def do_mouseup
+ @mouseDown = 0
+ @block[:mouseup].call(@mouseX, @mouseY) if @block[:mouseup]
+ end
+
+ # mouse events for fullscreen
+ def set_mousedown0(&b)
+ return unless block_given?
+ @block[:mousedown0] = Proc.new
+ end
+
+ def check_mousedown0
+ return ! @block[:mousedown0].nil?
+ end
+
+ # key events
+ def set_keydown(&b)
+ return unless block_given?
+ @block[:keydown] = Proc.new
+ end
+
+ def keydown_pre(key)
+ exit if key == SDL::Key::ESCAPE
+ end
+ private :keydown_pre
+
+ def do_keydown(key)
+ keydown_pre(key)
+ @block[:keydown].call(key) if @block[:keydown]
+ end
+
+ def set_keyup(&b)
+ return unless block_given?
+ @block[:keyup] = Proc.new
+ end
+
+ def do_keyup(key)
+ @block[:keyup].call(key) if @block[:keyup]
+ end
+
+ def calc_keynum(e)
+ input = e.characters
+ @keynum = input.to_s[0]
+ end
+ private :calc_keynum
+
+ def mainloop_setup
+ do_setup
+ end
+
+ def mainloop
+ mainloop_setup
+ @starttime = Time.now
+ loop {
+ @begintime = Time.now
+ do_display
+ delay
+ return if check_runtime_finished(@starttime)
+ }
+ end
+
+ def delay
+ if @options[:framerate]
+ sec_per_frame = 1.0 / @options[:framerate]
+ diff = sec_per_frame - (Time.now - @begintime)
+ sleep(diff) if 0 < diff
+ else
+ delaytime = @options[:delaytime]
+ sleep(delaytime)
+ end
+ end
+ private :delay
+
+ def check_runtime_finished(starttime)
+ runtime = @options[:runtime]
+ return false if runtime.nil?
+ diff = Time.now - starttime
+ return (runtime && runtime < diff)
+ end
+ private :check_runtime_finished
+
+ # novice mode
+ def flip
+ @starttime = Time.now if @starttime.nil?
+ display_post
+ delay
+ display_pre
+ #exit if check_runtime_finished(@starttime)
+ end
+
+ def wait
+ #SGL.flip if !$__v__.flipped
+ loop {
+ check_event
+ delay
+ return if check_runtime_finished(@starttime)
+ }
+ end
+
+ def process(&b)
+ block = Proc.new
+ @starttime = Time.now
+ loop {
+ check_event
+ block.call
+ #yield
+ delay
+ return if check_runtime_finished(@starttime)
+ }
+ end
+
+ # check event
+ def check_event
+ x, y, l, m, r = SDL::Mouse.state
+ # x pos, y pos, left button, middle button, right button
+ @mouseX, @mouseY = calc_mouse_xy(x, y)
+ @mouseX0, @mouseY0 = calc_fullscreen_mouse_xy(x, y)
+ event = @sdl_event
+ while event.poll != 0
+ case event.type
+ when SDL::Event::MOUSEBUTTONDOWN
+ do_mousedown
+ when SDL::Event::MOUSEBUTTONUP
+ do_mouseup
+ when SDL::Event::KEYDOWN
+ @keynum = event.info[2]
+ do_keydown(@keynum)
+ when SDL::Event::KEYUP
+ @keynum = event.info[2]
+ do_keyup(@keynum)
+ when SDL::Event::QUIT
+ exit
+ end
+ end
+ end
+
+ def calc_mouse_xy(x, y)
+ if @options[:fullscreen]
+ w, h = @options[:fullscreen]
+ mx = @cameraX - (w / 2) + x
+ my = @cameraY - (h / 2) + (h - y)
+ else
+ mx = @left + x
+ my = @bottom + (@height - y)
+ end
+ return [mx, my]
+ end
+
+ def calc_fullscreen_mouse_xy(x, y)
+ if @options[:fullscreen]
+ w, h = @options[:fullscreen]
+ mx = - (w / 2) + x
+ my = - (h / 2) + (h - y)
+ else
+ mx = @left + x
+ my = @bottom + (@height - y)
+ end
+ return [mx, my]
+ end
+ private :check_event, :calc_mouse_xy, :calc_fullscreen_mouse_xy
+ end
+end