rglviewer 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,8 @@ require 'opengl'
6
6
 
7
7
  include GLViewer,Gl
8
8
 
9
+ @start_angle = 0.0
10
+
9
11
  init = Proc.new do |v|
10
12
  v.display_fps = true
11
13
  v.display_grid = true
@@ -18,10 +20,10 @@ paint = Proc.new do |v|
18
20
  up = Math.sqrt(1.0 - nor * nor )
19
21
 
20
22
  glBegin(GL_QUAD_STRIP)
21
-
23
+ @start_angle += Math::PI / 500
22
24
  (1..nb_steps).each do |i|
23
25
  ratio = i.to_f/nb_steps;
24
- angle = 21.0 * ratio;
26
+ angle = 21.0 * ratio + @start_angle;
25
27
  c = Math.cos(angle)
26
28
  s = Math.sin(angle)
27
29
  r_1 = 1.0 - 0.8 * ratio
@@ -37,6 +39,7 @@ paint = Proc.new do |v|
37
39
 
38
40
  end
39
41
 
42
+
40
43
  viewer = GLViewer::GLViewer.new :render => paint , :init => init
41
44
 
42
45
  viewer.main_loop
@@ -0,0 +1,90 @@
1
+ require 'opengl'
2
+ require 'gslng'
3
+ require 'rglviewer/frame'
4
+
5
+
6
+ include Gl,Glu,GSLng
7
+
8
+ module GLViewer
9
+ class Camera
10
+
11
+
12
+ attr_reader :width, :height
13
+ attr_accessor :scene_radius, :scene_center, :type, :field_of_view
14
+
15
+ def initialize args = {}
16
+ @width = args[:width] || 640
17
+ @height = args[:height] || 480
18
+ @scene_radius = args[:scene_radius] || 1.0
19
+ @scene_center = args[:scene_center] || [0.0,0.0,0.0]
20
+ @type = args[:type] || :perspective
21
+ @field_of_view = args[:field_of_view] || Math::PI / 4.0
22
+ @z_clipping_coefficient = args[:z_clipping_coefficient] || Math.sqrt(3.0)
23
+ @z_near_coefficient = args[:z_near_corefficient] || 0.005
24
+ #@frame = args[:frame]
25
+ #unless @frame
26
+ # t = Vector.from_array [0.0, 0.0, 2 * @scene_radius]
27
+ # @frame.new :translation => t
28
+ #end
29
+ end
30
+
31
+ def load_projection_matrix
32
+ glMatrixMode(GL_PROJECTION)
33
+ glLoadIdentity
34
+ method("load_" + @type.to_s).call
35
+ end
36
+
37
+ def load_model_view_matrix
38
+ glMatrixMode(GL_MODELVIEW)
39
+ glLoadIdentity
40
+ glTranslatef(0.0,0.0, -5.0 * @scene_radius)
41
+ end
42
+
43
+ def width= w
44
+ @width = w > 0 ? w : 1
45
+ end
46
+
47
+ def height= h
48
+ @height = h > 0 ? h : 1
49
+ end
50
+
51
+ protected
52
+
53
+ def load_perspective
54
+ gluPerspective(180.0 * @field_of_view / Math::PI,
55
+ @width / @height,
56
+ z_near,
57
+ z_far)
58
+ end
59
+
60
+ def load_ortho
61
+ raise RuntimeError, "Unimplemented yet"
62
+ end
63
+
64
+ def distance_to_scene_center
65
+ 2.0
66
+ end
67
+
68
+ def z_near
69
+ z = self.distance_to_scene_center - @z_clipping_coefficient * @scene_radius
70
+
71
+ z_min = @z_near_coefficient * @z_clipping_coefficient * @scene_radius
72
+
73
+ if z < z_min
74
+ if @type == :perspective
75
+ z = z_min
76
+ end
77
+ if @type == :orthographic
78
+ z = 0.0
79
+ end
80
+ end
81
+ end
82
+
83
+ def z_far
84
+ self.distance_to_scene_center + @z_clipping_coefficient * @scene_radius
85
+ end
86
+
87
+
88
+
89
+ end
90
+ end
@@ -0,0 +1,48 @@
1
+ require 'gslng'
2
+
3
+ include GSLng
4
+
5
+ module GLViewer
6
+ class Frame
7
+ def initialize args = {}
8
+ translation = args[:translation] || Vector.new(3,true)
9
+ rotation = args[:rotation] || Matrix.new(3,3)
10
+ @direct = Matrix.new(4,4,false).identity
11
+ @indirect = @direct.clone
12
+ #@direct.view(0,3,3,1) = translation
13
+ #@direct.view(0,0,3,3) = rotation
14
+ #t_rotation = rotation.transpose
15
+ #@indirect.view(0,0,3,3) = t_rotation
16
+ #@indirect.view(0,3,3,1) = - t_rotation * translation
17
+ end
18
+
19
+
20
+ def direct_transform vec
21
+ @direct * vec
22
+ end
23
+
24
+ def reverse_transform vec
25
+ @indirect * vec
26
+ end
27
+
28
+ def self.rotate_x a
29
+ Matrix.from_array [1.0 , 0.0 , 0.0 ,
30
+ 0.0 , Math.cos(a), - Math.sin(a),
31
+ 0.0 , Math.sin(a), Math.cos(a)]
32
+ end
33
+
34
+ def self.rotate_y a
35
+ Matrix.from_array [ Math.cos(a) , 0.0 , Math.sin(a),
36
+ 0.0 , 1.0 , 0.0 ,
37
+ -Math.sin(a) , 0.0 , Math.cos(a)]
38
+ end
39
+
40
+ def self.rotate_z a
41
+ Matrix.from_array [Math.cos(a) , - Math.sin(a) , 0.0 ,
42
+ Math.sin(a) , Math.cos(a) , 0.0 ,
43
+ 0.0 , 0.0 , 1.0 ]
44
+ end
45
+
46
+
47
+ end
48
+ end
@@ -0,0 +1,91 @@
1
+ require 'opengl'
2
+
3
+ include Gl,Glu,Glut
4
+
5
+ module GLViewer
6
+ class GL2DViewer
7
+
8
+ attr_accessor :width,:height, :init,:render, :background
9
+
10
+ def initialize args = {}
11
+ @width = args[:width] || 640
12
+ @height = args[:height] || 480
13
+ @background = args[:background] || [255,255,255]
14
+ @init = args[:init] || Proc.new {}
15
+ @render = args[:render] || Proc.new {}
16
+ @width = 1 if @width <= 0
17
+ @height = 1 if @height <= 0
18
+ end
19
+
20
+
21
+
22
+ def main_loop
23
+ glutInit
24
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_ALPHA )
25
+ glutInitWindowSize(@width,@height)
26
+ glutInitWindowPosition(0,0)
27
+ @window = glutCreateWindow("RGLViewer")
28
+ glutDisplayFunc(method(:gl_draw).to_proc)
29
+ glutIdleFunc(method(:gl_idle).to_proc)
30
+ glutReshapeFunc(method(:gl_reshape).to_proc)
31
+
32
+ gl_init
33
+
34
+ glutMainLoop
35
+ end
36
+
37
+
38
+ protected
39
+
40
+
41
+ def gl_reshape width, height
42
+ @width = [1,width ].max
43
+ @height = [1,height].max
44
+
45
+ glViewport(0, 0, @width, @height)
46
+ glMatrixMode(GL_PROJECTION)
47
+
48
+ glLoadIdentity
49
+ glOrtho(0 , @width, @height, 0, 0, 1);
50
+ glMatrixMode(GL_MODELVIEW)
51
+ glLoadIdentity
52
+
53
+ gl_draw
54
+ end
55
+
56
+ def gl_init
57
+ glClearColor(*(@background.collect{|c| c / 255.0}),1)
58
+
59
+ glDisable(GL_DEPTH_TEST)
60
+
61
+ gl_reshape @width, @height
62
+
63
+ @init.call self
64
+
65
+ end
66
+
67
+ def gl_draw
68
+ gl_pre_draw
69
+
70
+ @render.call(self)
71
+
72
+ gl_post_draw
73
+ end
74
+
75
+ def gl_idle
76
+ glutPostRedisplay
77
+ end
78
+
79
+ def gl_pre_draw
80
+ glClear(GL_COLOR_BUFFER_BIT)
81
+
82
+ glMatrixMode(GL_MODELVIEW)
83
+ glLoadIdentity
84
+ end
85
+
86
+ def gl_post_draw
87
+ glutSwapBuffers
88
+ end
89
+
90
+ end
91
+ end
@@ -0,0 +1,114 @@
1
+ require 'opengl'
2
+
3
+ include Gl, Glu, Glut
4
+
5
+ module GLViewer
6
+ class GLViewer
7
+ attr_accessor :camera, :render, :init
8
+ attr_writer :display_grid,:display_frame, :display_fps
9
+
10
+ def initialize args = {}
11
+ @background_color = args[:background_color] || [180, 180, 180]
12
+ @foreground_color = args[:background_color] || [51, 51, 51]
13
+ @display_grid = args[:display_grid] || false
14
+ @display_fps = args[:display_fps] || false
15
+ @display_frame = args[:display_frame] || false
16
+ @init = args[:init] || Proc.new {}
17
+ @render = args[:render] || Proc.new {}
18
+ self.camera = args[:camera] || Camera.new
19
+ end
20
+
21
+ def camera= cam
22
+ unless cam.is_a?(Camera)
23
+ raise ArgumentError "You should pass a GLViewer::Camera object as a camera."
24
+ end
25
+ @camera = cam
26
+ end
27
+ def display_grid?
28
+ @display_grid
29
+ end
30
+
31
+ def display_frame?
32
+ @display_frame
33
+ end
34
+
35
+ def display_fps?
36
+ @display_fps
37
+ end
38
+
39
+ def main_loop
40
+ glutInit
41
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
42
+ glutInitWindowSize(@camera.width,@camera.height)
43
+ glutInitWindowPosition(0,0)
44
+ @window = glutCreateWindow("RGLViewer")
45
+ glutDisplayFunc(method(:gl_draw).to_proc)
46
+ glutIdleFunc(method(:gl_idle).to_proc)
47
+ glutReshapeFunc(method(:gl_reshape).to_proc)
48
+
49
+ gl_init
50
+
51
+ glutMainLoop
52
+ end
53
+
54
+ protected
55
+ def gl_init
56
+
57
+ glClearColor(*(@background_color.collect{|c| c / 255.0}),1)
58
+ # Enables clearing of depth buffer
59
+ glClearDepth(1.0)
60
+ # Set type of depth test
61
+ glDepthFunc(GL_LEQUAL)
62
+ # Enable depth testing
63
+ glEnable(GL_DEPTH_TEST)
64
+ # Enable smooth color shading
65
+ glShadeModel(GL_SMOOTH)
66
+
67
+ glEnable(GL_COLOR_MATERIAL)
68
+
69
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
70
+
71
+ gl_reshape @camera.width, @camera.height
72
+
73
+ @init.call(self)
74
+
75
+ gl_draw
76
+ end
77
+
78
+ def gl_pre_draw
79
+
80
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
81
+
82
+ @camera.load_projection_matrix
83
+ @camera.load_model_view_matrix
84
+
85
+ end
86
+
87
+ def gl_post_draw
88
+ glutSwapBuffers
89
+ end
90
+
91
+ def gl_draw
92
+
93
+ gl_pre_draw
94
+
95
+ @render.call(self)
96
+
97
+ gl_post_draw
98
+
99
+ end
100
+
101
+ def gl_idle
102
+ glutPostRedisplay
103
+ end
104
+
105
+ def gl_reshape width, height
106
+ @camera.width = width
107
+ @camera.height = height
108
+
109
+ glViewport(0,0,@camera.width,@camera.height)
110
+ glutPostRedisplay
111
+ end
112
+
113
+ end
114
+ end
@@ -1,3 +1,3 @@
1
1
  module GLViewer
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/rglviewer.gemspec CHANGED
@@ -21,4 +21,6 @@ Gem::Specification.new do |s|
21
21
 
22
22
  s.add_development_dependency "rspec"
23
23
  s.add_dependency 'ruby-opengl2'
24
+ s.add_dependency 'ruby-gsl-ng'
25
+
24
26
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rglviewer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-20 00:00:00.000000000Z
12
+ date: 2012-01-25 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &10341080 !ruby/object:Gem::Requirement
16
+ requirement: &9686040 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *10341080
24
+ version_requirements: *9686040
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: ruby-opengl2
27
- requirement: &10291940 !ruby/object:Gem::Requirement
27
+ requirement: &9685620 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,18 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *10291940
35
+ version_requirements: *9685620
36
+ - !ruby/object:Gem::Dependency
37
+ name: ruby-gsl-ng
38
+ requirement: &9685080 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *9685080
36
47
  description: libQGLViewer clone using glut
37
48
  email:
38
49
  - alexandre.tuleu.2005@polytechnique.org
@@ -51,6 +62,10 @@ files:
51
62
  - examples/simpleviewer.rb
52
63
  - examples/test.rb
53
64
  - lib/rglviewer.rb
65
+ - lib/rglviewer/camera.rb
66
+ - lib/rglviewer/frame.rb
67
+ - lib/rglviewer/gl2dviewer.rb
68
+ - lib/rglviewer/glviewer.rb
54
69
  - lib/rglviewer/version.rb
55
70
  - rglviewer.gemspec
56
71
  - spec/glviewer_spec.rb