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.
- data/.yardopts +6 -0
- data/Gemfile +4 -0
- data/README.md +1 -1
- data/Rakefile +5 -0
- data/examples/ogl-2_1-basic.rb +15 -7
- data/examples/ogl-3_2-attribute_less.rb +119 -0
- data/examples/ogl-3_2-basic.rb +17 -9
- data/examples/ogl-3_2-cube.rb +1 -0
- data/examples/ogl-3_2-texture.rb +163 -0
- data/examples/ogl-4_0-quad_tessellation.rb +1 -0
- data/examples/ogl-4_0-triangle_tessellation.rb +1 -0
- data/lib/glut.rb +13 -11
- data/lib/opengl/constants.rb +4 -1
- data/lib/opengl/gl.rb +6 -0
- data/lib/opengl/platform/base.rb +8 -6
- data/lib/opengl/platform/darwin.rb +1 -0
- data/lib/opengl/platform/linux.rb +1 -0
- data/lib/opengl/platform.rb +3 -0
- data/lib/opengl/raw.rb +7 -0
- data/lib/opengl/type.rb +22 -5
- data/lib/opengl/version.rb +1 -1
- data/lib/opengl/wrapper/base.rb +69 -0
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_0.rb +22 -119
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_1.rb +4 -17
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_2.rb +1 -8
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_3.rb +1 -11
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_4.rb +6 -7
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_1_5.rb +35 -22
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_2_0.rb +41 -120
- data/lib/opengl/wrapper/core/2_x/GL_VERSION_2_1.rb +1 -8
- data/lib/opengl/wrapper/core/3_0/GL_ARB_framebuffer_object.rb +7 -25
- data/lib/opengl/wrapper/core/3_0/GL_ARB_map_buffer_range.rb +15 -3
- data/lib/opengl/wrapper/core/3_0/GL_ARB_vertex_array_object.rb +3 -6
- data/lib/opengl/wrapper/core/3_0/GL_VERSION_3_0.rb +45 -59
- data/lib/opengl/wrapper/core/3_1/GL_ARB_copy_buffer.rb +6 -0
- data/lib/opengl/wrapper/core/3_1/GL_ARB_uniform_buffer_object.rb +13 -0
- data/lib/opengl/wrapper/core/3_1/GL_VERSION_3_1.rb +14 -0
- data/lib/opengl/wrapper/core/3_2/GL_ARB_draw_elements_base_vertex.rb +9 -0
- data/lib/opengl/wrapper/core/3_2/GL_ARB_provoking_vertex.rb +6 -0
- data/lib/opengl/wrapper/core/3_2/GL_ARB_sync.rb +12 -0
- data/lib/opengl/wrapper/core/3_2/GL_ARB_texture_multisample.rb +10 -0
- data/lib/opengl/wrapper/core/3_2/GL_VERSION_3_2.rb +19 -0
- data/lib/opengl/wrapper/core/3_3/GL_ARB_blend_func_extended.rb +6 -0
- data/lib/opengl/wrapper/core/3_3/GL_ARB_sampler_objects.rb +37 -0
- data/lib/opengl/wrapper/core/3_3/GL_ARB_timer_query.rb +13 -0
- data/lib/opengl/wrapper/core/3_3/GL_ARB_vertex_type_2_10_10_10_rev.rb +6 -0
- data/lib/opengl/wrapper/core/3_3/GL_VERSION_3_3.rb +12 -0
- data/lib/opengl/wrapper/core/4_0/GL_ARB_draw_indirect.rb +10 -0
- data/lib/opengl/wrapper/core/4_0/GL_ARB_gpu_shader_fp64.rb +10 -0
- data/lib/opengl/wrapper/core/4_0/GL_ARB_shader_subroutine.rb +14 -0
- data/lib/opengl/wrapper/core/4_0/GL_ARB_tessellation_shader.rb +10 -0
- data/lib/opengl/wrapper/core/4_0/GL_ARB_transform_feedback2.rb +13 -0
- data/lib/opengl/wrapper/core/4_0/GL_ARB_transform_feedback3.rb +25 -0
- data/lib/opengl/wrapper/core/4_0/GL_VERSION_4_0.rb +14 -0
- data/lib/opengl/wrapper/core/4_1/GL_ARB_ES2_compatibility.rb +10 -0
- data/lib/opengl/wrapper/core/4_1/GL_ARB_get_program_binary.rb +10 -0
- data/lib/opengl/wrapper/core/4_1/GL_ARB_separate_shader_objects.rb +24 -0
- data/lib/opengl/wrapper/core/4_1/GL_ARB_vertex_attrib_64bit.rb +10 -0
- data/lib/opengl/wrapper/core/4_1/GL_ARB_viewport_array.rb +18 -0
- data/lib/opengl/wrapper/core/4_1/GL_VERSION_4_1.rb +13 -0
- data/lib/opengl/wrapper/core/4_2/GL_ARB_base_instance.rb +6 -0
- data/lib/opengl/wrapper/core/4_2/GL_ARB_internalformat_query.rb +10 -0
- data/lib/opengl/wrapper/core/4_2/GL_ARB_shader_atomic_counters.rb +10 -0
- data/lib/opengl/wrapper/core/4_2/GL_ARB_shader_image_load_store.rb +6 -0
- data/lib/opengl/wrapper/core/4_2/GL_ARB_texture_storage.rb +6 -0
- data/lib/opengl/wrapper/core/4_2/GL_ARB_transform_feedback_instanced.rb +6 -0
- data/lib/opengl/wrapper/core/4_2/GL_VERSION_4_2.rb +14 -0
- data/lib/opengl/wrapper.rb +3 -3
- data/lib/opengl.rb +1 -0
- data/opengl.gemspec +1 -2
- data/yard/database.rb +51 -0
- data/yard/dsl_handler.rb +76 -0
- data/yard/wrapper_handler.rb +24 -0
- metadata +44 -21
- data/lib/opengl/wrapper/macros/base.rb +0 -80
data/.yardopts
ADDED
data/Gemfile
CHANGED
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
|
|
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)
|
data/examples/ogl-2_1-basic.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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
|
-
|
|
55
|
-
|
|
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
|
-
|
|
65
|
-
|
|
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
|
data/examples/ogl-3_2-basic.rb
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
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
|
-
|
|
74
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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)
|
data/examples/ogl-3_2-cube.rb
CHANGED
|
@@ -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
|
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
|
data/lib/opengl/constants.rb
CHANGED
|
@@ -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.
|
|
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"
|
data/lib/opengl/platform/base.rb
CHANGED
|
@@ -6,22 +6,24 @@ module OpenGL::Platform
|
|
|
6
6
|
|
|
7
7
|
def primitive_types
|
|
8
8
|
@primitive_types ||= begin
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
data/lib/opengl/platform.rb
CHANGED
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
|
-
|
|
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
|
-
|
|
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
|
data/lib/opengl/version.rb
CHANGED