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.
- 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