opengl3 0.0.1.pre1 → 0.0.1.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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