opengl3 0.0.1.pre1 → 0.0.1.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/.yardopts +6 -0
  2. data/Gemfile +4 -0
  3. data/README.md +1 -1
  4. data/Rakefile +5 -0
  5. data/examples/ogl-2_1-basic.rb +15 -7
  6. data/examples/ogl-3_2-attribute_less.rb +119 -0
  7. data/examples/ogl-3_2-basic.rb +17 -9
  8. data/examples/ogl-3_2-cube.rb +1 -0
  9. data/examples/ogl-3_2-texture.rb +163 -0
  10. data/examples/ogl-4_0-quad_tessellation.rb +1 -0
  11. data/examples/ogl-4_0-triangle_tessellation.rb +1 -0
  12. data/lib/glut.rb +13 -11
  13. data/lib/opengl/constants.rb +4 -1
  14. data/lib/opengl/gl.rb +6 -0
  15. data/lib/opengl/platform/base.rb +8 -6
  16. data/lib/opengl/platform/darwin.rb +1 -0
  17. data/lib/opengl/platform/linux.rb +1 -0
  18. data/lib/opengl/platform.rb +3 -0
  19. data/lib/opengl/raw.rb +7 -0
  20. data/lib/opengl/type.rb +22 -5
  21. data/lib/opengl/version.rb +1 -1
  22. data/lib/opengl/wrapper/base.rb +69 -0
  23. data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_0.rb +22 -119
  24. data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_1.rb +4 -17
  25. data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_2.rb +1 -8
  26. data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_3.rb +1 -11
  27. data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_4.rb +6 -7
  28. data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_5.rb +35 -22
  29. data/lib/opengl/wrapper/core/2_x/GL_VERSION_2_0.rb +41 -120
  30. data/lib/opengl/wrapper/core/2_x/GL_VERSION_2_1.rb +1 -8
  31. data/lib/opengl/wrapper/core/3_0/GL_ARB_framebuffer_object.rb +7 -25
  32. data/lib/opengl/wrapper/core/3_0/GL_ARB_map_buffer_range.rb +15 -3
  33. data/lib/opengl/wrapper/core/3_0/GL_ARB_vertex_array_object.rb +3 -6
  34. data/lib/opengl/wrapper/core/3_0/GL_VERSION_3_0.rb +45 -59
  35. data/lib/opengl/wrapper/core/3_1/GL_ARB_copy_buffer.rb +6 -0
  36. data/lib/opengl/wrapper/core/3_1/GL_ARB_uniform_buffer_object.rb +13 -0
  37. data/lib/opengl/wrapper/core/3_1/GL_VERSION_3_1.rb +14 -0
  38. data/lib/opengl/wrapper/core/3_2/GL_ARB_draw_elements_base_vertex.rb +9 -0
  39. data/lib/opengl/wrapper/core/3_2/GL_ARB_provoking_vertex.rb +6 -0
  40. data/lib/opengl/wrapper/core/3_2/GL_ARB_sync.rb +12 -0
  41. data/lib/opengl/wrapper/core/3_2/GL_ARB_texture_multisample.rb +10 -0
  42. data/lib/opengl/wrapper/core/3_2/GL_VERSION_3_2.rb +19 -0
  43. data/lib/opengl/wrapper/core/3_3/GL_ARB_blend_func_extended.rb +6 -0
  44. data/lib/opengl/wrapper/core/3_3/GL_ARB_sampler_objects.rb +37 -0
  45. data/lib/opengl/wrapper/core/3_3/GL_ARB_timer_query.rb +13 -0
  46. data/lib/opengl/wrapper/core/3_3/GL_ARB_vertex_type_2_10_10_10_rev.rb +6 -0
  47. data/lib/opengl/wrapper/core/3_3/GL_VERSION_3_3.rb +12 -0
  48. data/lib/opengl/wrapper/core/4_0/GL_ARB_draw_indirect.rb +10 -0
  49. data/lib/opengl/wrapper/core/4_0/GL_ARB_gpu_shader_fp64.rb +10 -0
  50. data/lib/opengl/wrapper/core/4_0/GL_ARB_shader_subroutine.rb +14 -0
  51. data/lib/opengl/wrapper/core/4_0/GL_ARB_tessellation_shader.rb +10 -0
  52. data/lib/opengl/wrapper/core/4_0/GL_ARB_transform_feedback2.rb +13 -0
  53. data/lib/opengl/wrapper/core/4_0/GL_ARB_transform_feedback3.rb +25 -0
  54. data/lib/opengl/wrapper/core/4_0/GL_VERSION_4_0.rb +14 -0
  55. data/lib/opengl/wrapper/core/4_1/GL_ARB_ES2_compatibility.rb +10 -0
  56. data/lib/opengl/wrapper/core/4_1/GL_ARB_get_program_binary.rb +10 -0
  57. data/lib/opengl/wrapper/core/4_1/GL_ARB_separate_shader_objects.rb +24 -0
  58. data/lib/opengl/wrapper/core/4_1/GL_ARB_vertex_attrib_64bit.rb +10 -0
  59. data/lib/opengl/wrapper/core/4_1/GL_ARB_viewport_array.rb +18 -0
  60. data/lib/opengl/wrapper/core/4_1/GL_VERSION_4_1.rb +13 -0
  61. data/lib/opengl/wrapper/core/4_2/GL_ARB_base_instance.rb +6 -0
  62. data/lib/opengl/wrapper/core/4_2/GL_ARB_internalformat_query.rb +10 -0
  63. data/lib/opengl/wrapper/core/4_2/GL_ARB_shader_atomic_counters.rb +10 -0
  64. data/lib/opengl/wrapper/core/4_2/GL_ARB_shader_image_load_store.rb +6 -0
  65. data/lib/opengl/wrapper/core/4_2/GL_ARB_texture_storage.rb +6 -0
  66. data/lib/opengl/wrapper/core/4_2/GL_ARB_transform_feedback_instanced.rb +6 -0
  67. data/lib/opengl/wrapper/core/4_2/GL_VERSION_4_2.rb +14 -0
  68. data/lib/opengl/wrapper.rb +3 -3
  69. data/lib/opengl.rb +1 -0
  70. data/opengl.gemspec +1 -2
  71. data/yard/database.rb +51 -0
  72. data/yard/dsl_handler.rb +76 -0
  73. data/yard/wrapper_handler.rb +24 -0
  74. metadata +44 -21
  75. data/lib/opengl/wrapper/macros/base.rb +0 -80
data/.yardopts ADDED
@@ -0,0 +1,6 @@
1
+ --no-private
2
+ --load yard/wrapper_handler.rb
3
+ --load yard/dsl_handler.rb
4
+ lib/opengl/**/*.rb
5
+ -
6
+ lib/glut.rb
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in opengl.gemspec
4
4
  gemspec
5
+
6
+ gem 'yard', :platform => 'mri'
7
+ gem 'redcarpet', :platform => 'mri'
8
+
data/README.md CHANGED
@@ -6,7 +6,7 @@ OpenGL wrapper library for Ruby
6
6
  * OpenGL 2.1 ~ 4.2
7
7
  * automatic error checking each function call
8
8
  * Ruby-style wrapper (not complete)
9
- * Works on OS X 10.8 and Linux (Windows will be supported in the future)
9
+ * Works on OS X 10.8 and Linux
10
10
  * Inspired by PyOpenGL
11
11
 
12
12
  ## Notice
data/Rakefile CHANGED
@@ -1,5 +1,6 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rake/testtask"
3
+ require "yard"
3
4
 
4
5
  Rake::TestTask.new :spec do |t|
5
6
  t.libs << "spec"
@@ -15,3 +16,7 @@ desc "Open an irb session preloaded with this library"
15
16
  task :console do
16
17
  sh "irb -rubygems -I lib -r opengl"
17
18
  end
19
+
20
+ YARD::Rake::YardocTask.new
21
+ desc "Generate documentation"
22
+ task(:doc => :yard)
@@ -8,13 +8,15 @@ class TestApp
8
8
  include OpenGL::Constants
9
9
 
10
10
  def initialize
11
+ glutInit()
11
12
  caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
12
13
  glutInitDisplayMode(caps)
13
14
  glutInitWindowPosition(300, 200)
14
15
  glutInitWindowSize(512, 512)
15
16
  glutCreateWindow('test')
16
17
 
17
- glutDisplayFunc(@draw_method ||= method(:draw)) # prevent from being GCed
18
+ # prevent callback proc from being garbage-collected
19
+ glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
18
20
  end
19
21
 
20
22
  def start
@@ -42,17 +44,21 @@ class TestApp
42
44
  vertex_shader = glCreateShader(:vertex)
43
45
  glShaderSource(vertex_shader, VS_CODE)
44
46
  glCompileShader(vertex_shader)
47
+ err_msg = glGetShaderInfoLog(vertex_shader)
45
48
  unless glIsShaderCompiled?(vertex_shader)
46
- msg = glGetShaderInfoLog(vertex_shader)
47
- raise RuntimeError, "vertex_shader:\n#{msg}"
49
+ raise RuntimeError, "vertex_shader:\n#{err_msg}"
50
+ else
51
+ $stderr.puts "vertex_shader:\n#{err_msg}"
48
52
  end
49
53
 
50
54
  fragment_shader = glCreateShader(:fragment)
51
55
  glShaderSource(fragment_shader, FS_CODE)
52
56
  glCompileShader(fragment_shader)
57
+ err_msg = glGetShaderInfoLog(fragment_shader)
53
58
  unless glIsShaderCompiled?(fragment_shader)
54
- msg = glGetShaderInfoLog(fragment_shader)
55
- raise RuntimeError, "fragment_shader:\n#{msg}"
59
+ raise RuntimeError, "fragment_shader:\n#{err_msg}"
60
+ else
61
+ $stderr.puts "fragment_shader:\n#{err_msg}"
56
62
  end
57
63
 
58
64
  program = glCreateProgram()
@@ -60,9 +66,11 @@ class TestApp
60
66
  glAttachShader(program, fragment_shader)
61
67
  glBindAttribLocation(program, 0, "in_Position")
62
68
  glLinkProgram(program)
69
+ err_msg = glGetProgramInfoLog(program)
63
70
  unless glIsProgramLinked?(program)
64
- msg = glGetProgramInfoLog(program)
65
- raise RuntimeError, "program:\n#{msg}"
71
+ raise RuntimeError, "program:\n#{err_msg}"
72
+ else
73
+ $stderr.puts "program:\n#{err_msg}"
66
74
  end
67
75
  glDeleteShader(vertex_shader)
68
76
  glDeleteShader(fragment_shader)
@@ -0,0 +1,119 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'opengl'
4
+ require 'glut'
5
+
6
+ class TestApp
7
+ include GLUT
8
+ include OpenGL::Constants
9
+
10
+ def initialize
11
+ glutInit()
12
+ caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
13
+ if FFI::Platform.mac?
14
+ caps |= GLUT_3_2_CORE_PROFILE
15
+ else
16
+ glutInitContextVersion(3, 2)
17
+ glutInitContextProfile(:core)
18
+ end
19
+ glutInitDisplayMode(caps)
20
+ glutInitWindowPosition(300, 200)
21
+ glutInitWindowSize(512, 512)
22
+ glutCreateWindow('test')
23
+
24
+ # prevent callback proc from being garbage-collected
25
+ glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
26
+ end
27
+
28
+ def start
29
+ self.extend OpenGL::GL.entrypoints
30
+ puts glGetString(GL_VERSION)
31
+ puts glGetBooleanv(GL_DEPTH_TEST, 1).inspect
32
+ puts glGetDoublev(GL_COLOR_CLEAR_VALUE, 4).inspect
33
+ puts glGetFloatv(GL_LINE_WIDTH, 1).inspect
34
+ puts glGetIntegerv(GL_VIEWPORT, 4).inspect
35
+ puts glGetVersion().inspect
36
+ puts glGetShadingLanguageVersion().inspect
37
+ puts glGetAvailableExtensions().inspect
38
+
39
+ @dummy = glGenVertexArrays(1)[0]
40
+
41
+ @program = begin
42
+ vertex_shader = glCreateShader(:vertex)
43
+ glShaderSource(vertex_shader, VS_CODE)
44
+ glCompileShader(vertex_shader)
45
+ err_msg = glGetShaderInfoLog(vertex_shader)
46
+ unless glIsShaderCompiled?(vertex_shader)
47
+ raise RuntimeError, "vertex_shader:\n#{err_msg}"
48
+ else
49
+ $stderr.puts "vertex_shader:\n#{err_msg}"
50
+ end
51
+
52
+ fragment_shader = glCreateShader(:fragment)
53
+ glShaderSource(fragment_shader, FS_CODE)
54
+ glCompileShader(fragment_shader)
55
+ err_msg = glGetShaderInfoLog(fragment_shader)
56
+ unless glIsShaderCompiled?(fragment_shader)
57
+ raise RuntimeError, "fragment_shader:\n#{err_msg}"
58
+ else
59
+ $stderr.puts "fragment_shader:\n#{err_msg}"
60
+ end
61
+
62
+ program = glCreateProgram()
63
+ glAttachShader(program, vertex_shader)
64
+ glAttachShader(program, fragment_shader)
65
+ glBindFragDataLocation(program, 0, "fs_FragColor")
66
+ glLinkProgram(program)
67
+ err_msg = glGetProgramInfoLog(program)
68
+ unless glIsProgramLinked?(program)
69
+ raise RuntimeError, "program:\n#{err_msg}"
70
+ else
71
+ $stderr.puts "program:\n#{err_msg}"
72
+ end
73
+ glDeleteShader(vertex_shader)
74
+ glDeleteShader(fragment_shader)
75
+ program
76
+ end
77
+
78
+ glutMainLoop()
79
+ end
80
+
81
+ def draw
82
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
83
+
84
+ glUseProgram(@program)
85
+ glBindVertexArray(@dummy)
86
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
87
+
88
+ glutSwapBuffers()
89
+ end
90
+
91
+ VS_CODE =<<-GLSL
92
+ #version 150 core
93
+ out vec2 vs_TexCoord;
94
+
95
+ const vec2 data[4] = vec2[](
96
+ vec2(-1.0, 1.0), vec2(-1.0,-1.0), vec2( 1.0, 1.0), vec2( 1.0,-1.0)
97
+ );
98
+
99
+ void main()
100
+ {
101
+ vec3 pos = vec3(data[gl_VertexID], 0.0);
102
+ gl_Position = vec4(pos * 0.5, 1.0);
103
+ vs_TexCoord = pos.xy * 0.5 + 0.5;
104
+ }
105
+ GLSL
106
+
107
+ FS_CODE =<<-GLSL
108
+ #version 150 core
109
+ in vec2 vs_TexCoord;
110
+ out vec4 fs_FragColor;
111
+ void main()
112
+ {
113
+ fs_FragColor = vec4(vs_TexCoord, 0.0, 1.0);
114
+ }
115
+ GLSL
116
+
117
+ end
118
+
119
+ TestApp.new.start
@@ -8,6 +8,7 @@ class TestApp
8
8
  include OpenGL::Constants
9
9
 
10
10
  def initialize
11
+ glutInit()
11
12
  caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
12
13
  if FFI::Platform.mac?
13
14
  caps |= GLUT_3_2_CORE_PROFILE
@@ -20,15 +21,16 @@ class TestApp
20
21
  glutInitWindowSize(512, 512)
21
22
  glutCreateWindow('test')
22
23
 
23
- glutDisplayFunc(@draw_method ||= method(:draw)) # prevent from being GCed
24
+ # prevent callback proc from being garbage-collected
25
+ glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
24
26
  end
25
27
 
26
28
  def start
27
29
  self.extend OpenGL::GL.entrypoints
28
30
  puts glGetString(GL_VERSION)
29
- puts glGetBooleanv(GL_DEPTH_TEST).inspect
31
+ puts glGetBooleanv(GL_DEPTH_TEST, 1).inspect
30
32
  puts glGetDoublev(GL_COLOR_CLEAR_VALUE, 4).inspect
31
- puts glGetFloatv(GL_LINE_WIDTH).inspect
33
+ puts glGetFloatv(GL_LINE_WIDTH, 1).inspect
32
34
  puts glGetIntegerv(GL_VIEWPORT, 4).inspect
33
35
  puts glGetVersion().inspect
34
36
  puts glGetShadingLanguageVersion().inspect
@@ -61,17 +63,21 @@ class TestApp
61
63
  vertex_shader = glCreateShader(:vertex)
62
64
  glShaderSource(vertex_shader, VS_CODE)
63
65
  glCompileShader(vertex_shader)
66
+ err_msg = glGetShaderInfoLog(vertex_shader)
64
67
  unless glIsShaderCompiled?(vertex_shader)
65
- msg = glGetShaderInfoLog(vertex_shader)
66
- raise RuntimeError, "vertex_shader:\n#{msg}"
68
+ raise RuntimeError, "vertex_shader:\n#{err_msg}"
69
+ else
70
+ $stderr.puts "vertex_shader:\n#{err_msg}"
67
71
  end
68
72
 
69
73
  fragment_shader = glCreateShader(:fragment)
70
74
  glShaderSource(fragment_shader, FS_CODE)
71
75
  glCompileShader(fragment_shader)
76
+ err_msg = glGetShaderInfoLog(fragment_shader)
72
77
  unless glIsShaderCompiled?(fragment_shader)
73
- msg = glGetShaderInfoLog(fragment_shader)
74
- raise RuntimeError, "fragment_shader:\n#{msg}"
78
+ raise RuntimeError, "fragment_shader:\n#{err_msg}"
79
+ else
80
+ $stderr.puts "fragment_shader:\n#{err_msg}"
75
81
  end
76
82
 
77
83
  program = glCreateProgram()
@@ -80,9 +86,11 @@ class TestApp
80
86
  glBindAttribLocation(program, 0, "in_Position")
81
87
  glBindFragDataLocation(program, 0, "fs_FragColor")
82
88
  glLinkProgram(program)
89
+ err_msg = glGetProgramInfoLog(program)
83
90
  unless glIsProgramLinked?(program)
84
- msg = glGetProgramInfoLog(program)
85
- raise RuntimeError, "program:\n#{msg}"
91
+ raise RuntimeError, "program:\n#{err_msg}"
92
+ else
93
+ $stderr.puts "program:\n#{err_msg}"
86
94
  end
87
95
  glDeleteShader(vertex_shader)
88
96
  glDeleteShader(fragment_shader)
@@ -9,6 +9,7 @@ class TestApp
9
9
  include OpenGL::Constants
10
10
 
11
11
  def initialize
12
+ glutInit()
12
13
  caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
13
14
  if FFI::Platform.mac?
14
15
  caps |= GLUT_3_2_CORE_PROFILE
@@ -0,0 +1,163 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'opengl'
4
+ require 'glut'
5
+
6
+ class TestApp
7
+ include GLUT
8
+ include OpenGL::Constants
9
+
10
+ def initialize
11
+ glutInit()
12
+ caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
13
+ if FFI::Platform.mac?
14
+ caps |= GLUT_3_2_CORE_PROFILE
15
+ else
16
+ glutInitContextVersion(3, 2)
17
+ glutInitContextProfile(:core)
18
+ end
19
+ glutInitDisplayMode(caps)
20
+ glutInitWindowPosition(300, 200)
21
+ glutInitWindowSize(512, 512)
22
+ glutCreateWindow('test')
23
+
24
+ # prevent callback proc from being garbage-collected
25
+ glutDisplayFunc(@draw_proc ||= method(:draw).to_proc)
26
+ end
27
+
28
+ def start
29
+ self.extend OpenGL::GL.entrypoints
30
+ puts glGetString(GL_VERSION)
31
+
32
+ @quad = begin
33
+ buffer = glGenBuffers(1)[0]
34
+ glBindBuffer(GL_ARRAY_BUFFER, buffer)
35
+ glBufferData(GL_ARRAY_BUFFER, 3 * 4 * 4, nil, GL_STATIC_DRAW)
36
+ glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY) do |ptr|
37
+ ptr.put_array_of_GLfloat( 0, [-0.5, 0.5, 0.0])
38
+ ptr.put_array_of_GLfloat(12, [-0.5,-0.5, 0.0])
39
+ ptr.put_array_of_GLfloat(24, [ 0.5, 0.5, 0.0])
40
+ ptr.put_array_of_GLfloat(36, [ 0.5,-0.5, 0.0])
41
+ end
42
+
43
+ array = glGenVertexArrays(1)[0]
44
+ glBindVertexArray(array)
45
+ glBindBuffer(GL_ARRAY_BUFFER, buffer)
46
+ glEnableVertexAttribArray(0)
47
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nil)
48
+
49
+ glBindVertexArray(0)
50
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
51
+
52
+ array
53
+ end
54
+
55
+ @program = begin
56
+ vertex_shader = glCreateShader(:vertex)
57
+ glShaderSource(vertex_shader, VS_CODE)
58
+ glCompileShader(vertex_shader)
59
+ err_msg = glGetShaderInfoLog(vertex_shader)
60
+ unless glIsShaderCompiled?(vertex_shader)
61
+ raise RuntimeError, "vertex_shader:\n#{err_msg}"
62
+ else
63
+ $stderr.puts "vertex_shader:\n#{err_msg}"
64
+ end
65
+
66
+ fragment_shader = glCreateShader(:fragment)
67
+ glShaderSource(fragment_shader, FS_CODE)
68
+ glCompileShader(fragment_shader)
69
+ err_msg = glGetShaderInfoLog(fragment_shader)
70
+ unless glIsShaderCompiled?(fragment_shader)
71
+ raise RuntimeError, "fragment_shader:\n#{err_msg}"
72
+ else
73
+ $stderr.puts "fragment_shader:\n#{err_msg}"
74
+ end
75
+
76
+ program = glCreateProgram()
77
+ glAttachShader(program, vertex_shader)
78
+ glAttachShader(program, fragment_shader)
79
+ glBindAttribLocation(program, 0, "in_Position")
80
+ glBindFragDataLocation(program, 0, "fs_FragColor")
81
+ glLinkProgram(program)
82
+ err_msg = glGetProgramInfoLog(program)
83
+ unless glIsProgramLinked?(program)
84
+ raise RuntimeError, "program:\n#{err_msg}"
85
+ else
86
+ $stderr.puts "program:\n#{err_msg}"
87
+ end
88
+ glDeleteShader(vertex_shader)
89
+ glDeleteShader(fragment_shader)
90
+ program
91
+ end
92
+
93
+ @texture = begin
94
+ texture = glGenTextures(1)[0]
95
+
96
+ width, height = [32, 32]
97
+ data_ptr = FFI::MemoryPointer.new(:uint32, width * height)
98
+ (0...height).each do |y|
99
+ (0...width).each do |x|
100
+ color = (x + y) % 2 == 0 ? 0x0 : 0xffffffff
101
+ if (((Float(x)/width)**2) + ((Float(y)/height)**2)) <= 1.0
102
+ color = 0xff0000ff
103
+ end
104
+ data_ptr.put_uint32(4*(y*width+x), color)
105
+ end
106
+ end
107
+
108
+ glBindTexture(GL_TEXTURE_2D, texture)
109
+ glTexImage2D GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
110
+ GL_BGRA, GL_UNSIGNED_BYTE, data_ptr
111
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
112
+ glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, [GL_NEAREST])
113
+
114
+ glBindTexture(GL_TEXTURE_2D, 0)
115
+
116
+ texture
117
+ end
118
+
119
+ glutMainLoop()
120
+ end
121
+
122
+ def draw
123
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
124
+
125
+ glUseProgram(@program)
126
+ if (loc = glGetUniformLocation(@program, "u_Texture")) > -1
127
+ glUniform1i(loc, 0)
128
+ end
129
+
130
+ glActiveTexture(GL_TEXTURE0)
131
+ glBindTexture(GL_TEXTURE_2D, @texture)
132
+
133
+ glBindVertexArray(@quad)
134
+ glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
135
+
136
+ glutSwapBuffers()
137
+ end
138
+
139
+ VS_CODE =<<-GLSL
140
+ #version 150 core
141
+ in vec4 in_Position;
142
+ out vec2 vs_TexCoord;
143
+ void main()
144
+ {
145
+ gl_Position = in_Position;
146
+ vs_TexCoord = in_Position.xy + 0.5;
147
+ }
148
+ GLSL
149
+
150
+ FS_CODE =<<-GLSL
151
+ #version 150 core
152
+ in vec2 vs_TexCoord;
153
+ out vec4 fs_FragColor;
154
+ uniform sampler2D u_Texture;
155
+ void main()
156
+ {
157
+ fs_FragColor = texture(u_Texture, vs_TexCoord);
158
+ }
159
+ GLSL
160
+
161
+ end
162
+
163
+ TestApp.new.start
@@ -9,6 +9,7 @@ class TestApp
9
9
  include OpenGL::Constants
10
10
 
11
11
  def initialize
12
+ glutInit()
12
13
  caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
13
14
  if FFI::Platform.mac?
14
15
  caps |= GLUT_4_0_CORE_PROFILE
@@ -9,6 +9,7 @@ class TestApp
9
9
  include OpenGL::Constants
10
10
 
11
11
  def initialize
12
+ glutInit()
12
13
  caps = GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE
13
14
  if FFI::Platform.mac?
14
15
  caps |= GLUT_4_0_CORE_PROFILE
data/lib/glut.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'ffi'
2
2
 
3
+ # GLUT library for Ruby
3
4
  module GLUT
4
5
  extend FFI::Library
5
6
 
@@ -36,7 +37,18 @@ module GLUT
36
37
  GLUT_3_2_CORE_PROFILE = 0x0800 # only for OS X 10.7 and later
37
38
 
38
39
  # Init GLUT
39
- attach_function :glutInit, [:pointer, :pointer], :void
40
+ attach_function :raw_glutInit, :glutInit, [:pointer, :pointer], :void
41
+
42
+ def glutInit
43
+ argc = FFI::MemoryPointer.new(:int, 1).write_int(0)
44
+ argv = FFI::MemoryPointer.new(:pointer, 1)
45
+ if RUBY_ENGINE == 'rbx'
46
+ argv.write_pointer(FFI::MemoryPointer::NULL)
47
+ else
48
+ argv.write_pointer(nil)
49
+ end
50
+ raw_glutInit(argc, argv)
51
+ end
40
52
 
41
53
  # Enter MainLoop (never return)
42
54
  attach_function :glutMainLoop, [], :void
@@ -112,14 +124,4 @@ module GLUT
112
124
  attach_function :glutInitContextProfile, [:context_profile], :void
113
125
  end
114
126
 
115
- # Module Initializer
116
- def self.init
117
- argc = FFI::MemoryPointer.new(:int, 1).write_int(0)
118
- argv = FFI::MemoryPointer.new(:pointer, 1)
119
- argv.write_pointer(FFI::MemoryPointer::NULL)
120
- glutInit(argc, argv)
121
- end
122
-
123
127
  end
124
-
125
- GLUT.init
@@ -1,8 +1,11 @@
1
1
  require 'yaml'
2
2
 
3
+ # OpenGL constants
3
4
  module OpenGL::Constants
5
+ # Root path of constant definition files
6
+ ROOT = File.expand_path("../constants", __FILE__)
4
7
 
5
- Dir[File.expand_path("../constants/**/GL_*.yml", __FILE__)].each do |path|
8
+ Dir[File.join(ROOT, "**/GL_*.yml")].each do |path|
6
9
  obj = YAML.load(File.read(path))
7
10
  obj.each do |name, value|
8
11
  unless value.is_a? Integer
data/lib/opengl/gl.rb CHANGED
@@ -6,9 +6,15 @@ require_relative "wrapper"
6
6
  require_relative "debugging"
7
7
 
8
8
  module OpenGL
9
+
10
+ # OpenGL entrypoints loader
9
11
  module GL
10
12
  include Constants
11
13
 
14
+ # Load entrypoints from the current context
15
+ #
16
+ # @return [Module] entrypoints
17
+ #
12
18
  def self.entrypoints
13
19
  unless Platform.current.current_context?
14
20
  raise RuntimeError, "OpenGL context is missing"
@@ -6,22 +6,24 @@ module OpenGL::Platform
6
6
 
7
7
  def primitive_types
8
8
  @primitive_types ||= begin
9
- root = File.expand_path('../types', __FILE__)
10
- table = YAML.load(File.read(File.join(root, 'default.yml')))
11
- path = File.join(root, "#{FFI::Platform::OS}.yml")
12
- table.merge! YAML.load(File.read(path)) if File.exists? path
13
- table.freeze
14
- end
9
+ root = File.expand_path('../types', __FILE__)
10
+ table = YAML.load(File.read(File.join(root, 'default.yml')))
11
+ path = File.join(root, "#{FFI::Platform::OS}.yml")
12
+ table.merge! YAML.load(File.read(path)) if File.exists? path
13
+ table.freeze
14
+ end
15
15
  end
16
16
 
17
17
  def calling_convention
18
18
  :default
19
19
  end
20
20
 
21
+ # @abstract
21
22
  def current_context?
22
23
  raise NotImplementedError
23
24
  end
24
25
 
26
+ # @abstract
25
27
  def find_function_address(name)
26
28
  raise NotImplementedError
27
29
  end
@@ -1,4 +1,5 @@
1
1
  module OpenGL::Platform
2
+ # @private
2
3
  module Darwin
3
4
  extend Base
4
5
 
@@ -1,4 +1,5 @@
1
1
  module OpenGL::Platform
2
+ # @private
2
3
  module Linux
3
4
  extend Base
4
5
 
@@ -1,4 +1,7 @@
1
1
  require 'ffi'
2
2
 
3
+ module OpenGL::Platform
4
+ end
5
+
3
6
  require_relative "platform/base"
4
7
  require_relative "platform/#{FFI::Platform::OS}"
data/lib/opengl/raw.rb CHANGED
@@ -3,9 +3,16 @@ require 'yaml'
3
3
 
4
4
  module OpenGL
5
5
  module Raw
6
+ # Root path of entrypoint definition files
6
7
  ROOT = File.expand_path('../raw', __FILE__)
7
8
 
9
+ # Generate module with raw entrypoints defined by GL extensions
10
+ #
11
+ # @param [String, Array<String>] names
12
+ # @return [Module] raw entrypoints
13
+ #
8
14
  def self.generate_module(*names)
15
+ names.flatten!
9
16
  paths = begin
10
17
  if names.empty?
11
18
  Dir[File.join(ROOT, "**/*.yml")]
data/lib/opengl/type.rb CHANGED
@@ -2,6 +2,8 @@ require 'ffi'
2
2
  require_relative 'platform'
3
3
 
4
4
  module OpenGL
5
+
6
+ # OpenGL Type mapper
5
7
  module Type
6
8
 
7
9
  @primitive_types = Platform.current.primitive_types.dup
@@ -16,6 +18,11 @@ module OpenGL
16
18
  [ [:GLchar_pointer_in, :buffer_in] ]
17
19
  ]
18
20
 
21
+ # Transform the OpenGL type to native type
22
+ #
23
+ # @param [Symbol, String] type
24
+ # @return [Symbol] native
25
+ #
19
26
  def self.find(type)
20
27
  type = type.to_sym
21
28
  type = @type_map.fetch(type, type)
@@ -26,6 +33,7 @@ module OpenGL
26
33
  end
27
34
  end
28
35
 
36
+ # @private
29
37
  MemoryPointerInstanceMethods = Module.new
30
38
  @primitive_types.each do |gl_type, old_type|
31
39
  code = <<-RUBY
@@ -59,15 +67,24 @@ module OpenGL
59
67
  self.module_eval code, __FILE__, __LINE__
60
68
  end
61
69
 
62
- def self.pointer(ptr = nil)
70
+ #
71
+ # @overload pointer(count)
72
+ # Create a memory pointer (FFI::MemoryPointer) with pointer type
73
+ # @param [Integer] count
74
+ # @return [FFI::MemoryPointer] with sizeof(pointer) * count
75
+ #
76
+ # @overload pointer(ptr)
77
+ # Ensure the pointer can work with the library
78
+ # If ptr is NULL (#null? == true), it returns nil
79
+ # @param [FFI::Pointer] ptr
80
+ # @return [FFI::Pointer] ptr (extended with extensions)
81
+ #
82
+ def self.pointer(ptr)
63
83
  if ptr.is_a? Integer
64
84
  ptr = FFI::MemoryPointer(:pointer, n)
65
85
  end
66
86
  ptr.extend MemoryPointerInstanceMethods
67
- end
68
-
69
- def self.to_boolean(bool)
70
- (bool && bool != 0) ? Constants::GL_TRUE : Constants::GL_FALSE
87
+ ptr.null? ? nil : ptr
71
88
  end
72
89
 
73
90
  end
@@ -1,3 +1,3 @@
1
1
  module OpenGL
2
- VERSION = "0.0.1.pre1"
2
+ VERSION = "0.0.1.pre2"
3
3
  end