rubygl 0.1.0 → 0.2.1

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 (38) hide show
  1. checksums.yaml +13 -5
  2. data/.travis/push-rdoc-to-gh-pages.sh +22 -0
  3. data/.travis.yml +18 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +12 -0
  6. data/LICENSE +21 -21
  7. data/README.md +40 -0
  8. data/Rakefile +98 -83
  9. data/bin/ffi_code_gen.rb +166 -166
  10. data/bin/gl_code_gen.rb +458 -458
  11. data/examples/faceted_example.rb +71 -64
  12. data/examples/instanced_example.rb +135 -127
  13. data/examples/phong_example.rb +80 -71
  14. data/ext/windows/RubyGL.so +0 -0
  15. data/lib/rubygl/event.rb +64 -0
  16. data/lib/{RubyGL → rubygl}/geometry.rb +216 -211
  17. data/lib/{RubyGL → rubygl}/math.rb +300 -300
  18. data/lib/{RubyGL → rubygl}/memory.rb +125 -121
  19. data/lib/rubygl/native/all_enums.rb +641 -0
  20. data/lib/{RubyGL/Native → rubygl/native}/glcontext.rb +23 -47
  21. data/lib/{RubyGL/Native → rubygl/native}/include/GLContext.h +36 -36
  22. data/lib/{RubyGL/Native → rubygl/native}/include/Input.h +15 -15
  23. data/lib/{RubyGL/Native → rubygl/native}/include/Window.h +27 -27
  24. data/lib/rubygl/native/input.rb +247 -0
  25. data/lib/{RubyGL/Native → rubygl/native}/opengl.rb +2808 -2032
  26. data/lib/{RubyGL/Native → rubygl/native}/src/GLContext.c +72 -72
  27. data/lib/{RubyGL/Native → rubygl/native}/src/Input.c +25 -25
  28. data/lib/{RubyGL/Native → rubygl/native}/src/Window.c +57 -57
  29. data/lib/{RubyGL/Native → rubygl/native}/window.rb +24 -24
  30. data/lib/{RubyGL → rubygl}/setup.rb +50 -50
  31. data/lib/{RubyGL → rubygl}/shader.rb +203 -203
  32. data/lib/{RubyGL → rubygl}/util.rb +77 -77
  33. data/lib/rubygl.rb +49 -48
  34. data/{RubyGL.gemspec → rubygl.gemspec} +20 -23
  35. data/test/test_util.rb +19 -0
  36. metadata +36 -33
  37. data/lib/RubyGL/Native/input.rb +0 -13
  38. data/lib/RubyGL/callback.rb +0 -10
@@ -1,203 +1,203 @@
1
- require_relative './native/opengl'
2
-
3
- module RubyGL
4
-
5
- class Shader
6
- def initialize(vert_src, frag_src)
7
- @v_shader_id = Native.glCreateShader(Native::GL_VERTEX_SHADER)
8
- @f_shader_id = Native.glCreateShader(Native::GL_FRAGMENT_SHADER)
9
- @attrib_locs, @uniform_locs = {}, {}
10
-
11
- # Pointer Used To Point To The String Of Our Source Code
12
- shader_src_ptr = FFI::MemoryPointer.new(:pointer)
13
- shader_src_len = FFI::MemoryPointer.new(:int)
14
-
15
- v_shader_ptr = FFI::MemoryPointer.from_string(vert_src)
16
- f_shader_ptr = FFI::MemoryPointer.from_string(frag_src)
17
-
18
- shader_src_ptr.write_pointer(v_shader_ptr.address)
19
- shader_src_len.write_int(vert_src.size)
20
- Native.glShaderSource(@v_shader_id, 1, shader_src_ptr, shader_src_len)
21
-
22
- shader_src_ptr.write_pointer(f_shader_ptr.address)
23
- shader_src_len.write_int(frag_src.size)
24
- Native.glShaderSource(@f_shader_id, 1, shader_src_ptr, shader_src_len)
25
-
26
- Native.glCompileShader(@v_shader_id)
27
- Native.glCompileShader(@f_shader_id)
28
-
29
- # Throw Exception With Compile Error If Compilation Failed
30
- Shader.compile_status(@v_shader_id)
31
- Shader.compile_status(@f_shader_id)
32
-
33
- @program_id = Native.glCreateProgram()
34
-
35
- Native.glAttachShader(@program_id, @v_shader_id)
36
- Native.glAttachShader(@program_id, @f_shader_id)
37
-
38
- Native.glLinkProgram(@program_id)
39
-
40
- Shader.link_status(@program_id)
41
- end
42
-
43
- def use_program()
44
- Native.glUseProgram(@program_id)
45
- end
46
-
47
- # Splat Operator Aggregates Incoming Parameters And Expands Outgoing Parameters
48
- # If method_sym Does Not Accept A Pointer To The Data, Pass nil For data And
49
- # Pass In The Normal Parameters Required For The Specific Method.
50
- def send_uniform(method_sym, var_name, data = nil, *args)
51
- loc = @uniform_locs[var_name] ||= uniform_location(var_name)
52
-
53
- if data != nil then
54
- data_ptr = FFI::MemoryPointer.new(:float, data.size)
55
- data_ptr.write_array_of_float(data)
56
-
57
- RubyGL::Native.send(method_sym, loc, *args, data_ptr)
58
- else
59
- RubyGL::Native.send(method_sym, loc, *args)
60
- end
61
- end
62
-
63
- def attrib_location(var_name)
64
- Native.glGetAttribLocation(@program_id, var_name)
65
- end
66
-
67
- private
68
- def uniform_location(var_name)
69
- Native.glGetUniformLocation(@program_id, var_name)
70
- end
71
-
72
- def self.compile_status(shader_id)
73
- result = FFI::MemoryPointer.new(:int)
74
- Native.glGetShaderiv(shader_id, Native::GL_COMPILE_STATUS, result)
75
-
76
- if (result.get_int(0) != Native::GL_TRUE) then
77
- Native.glGetShaderiv(shader_id, Native::GL_INFO_LOG_LENGTH, result)
78
-
79
- compile_log = FFI::MemoryPointer.new(:char, result.get_int(0))
80
-
81
- Native.glGetShaderInfoLog(shader_id, compile_log.total, FFI::MemoryPointer::NULL, compile_log)
82
-
83
- raise compile_log.read_string_to_null()
84
- end
85
- end
86
-
87
- def self.link_status(program_id)
88
- result = FFI::MemoryPointer.new(:int)
89
- Native.glGetProgramiv(program_id, Native::GL_LINK_STATUS, result)
90
-
91
- if (result.get_int(0) != Native::GL_TRUE) then
92
- Native.glGetProgramiv(program_id, Native::GL_INFO_LOG_LENGTH, result)
93
-
94
- link_log = FFI::MemoryPointer.new(:char, result.get_int(0))
95
-
96
- Native.glGetShaderInfoLog(program_id, link_log.total, FFI::MemoryPointer::NULL, link_log)
97
-
98
- raise link_log.read_string_to_null()
99
- end
100
- end
101
- end
102
-
103
- class ShaderGenerator
104
- def self.faceted_shader()
105
- Shader.new('''
106
- #version 130
107
- in vec3 position;
108
- out vec3 vPosition;
109
- uniform mat4 modelview;
110
- uniform mat4 perspective;
111
-
112
- void main() {
113
- vec4 hPosition = modelview * vec4(position, 1);
114
- vPosition = hPosition.xyz;
115
-
116
- gl_Position = perspective * hPosition;
117
- }
118
- ''','''
119
- #version 130
120
- in vec3 vPosition;
121
- out vec4 fColor;
122
- uniform vec4 color;
123
- uniform vec3 light;
124
-
125
- void main() {
126
- vec3 dx = dFdy(vPosition);
127
- vec3 dy = dFdx(vPosition);
128
- vec3 triangle_norm = normalize(cross(dx, dy));
129
- float factor = clamp(dot(triangle_norm, light), 0, 1);
130
-
131
- fColor = vec4(color.xyz * factor, color.w);
132
- }
133
- ''')
134
- end
135
-
136
- def self.color_shader()
137
- Shader.new('''
138
- #version 130
139
- in vec3 position;
140
- uniform mat4 modelview;
141
- uniform mat4 perspective;
142
-
143
- void main() {
144
- gl_Position = perspective * modelView * vec4(position, 1);
145
- }
146
- ''','''
147
- #version 130
148
- out vec4 fColor;
149
- uniform vec4 color;
150
-
151
- void main() {
152
- fColor = color;
153
- }
154
- ''')
155
- end
156
-
157
- def self.phong_shader()
158
- Shader.new('''
159
- #version 130
160
- in vec3 position;
161
- in vec3 normal;
162
- out vec3 vPosition;
163
- out vec3 vNormal;
164
- uniform mat4 modelview;
165
- uniform mat4 perspective;
166
-
167
- void main() {
168
- vec4 hPosition = modelview * vec4(position, 1);
169
- vPosition = hPosition.xyz;
170
- vNormal = (modelview * vec4(normal, 1)).xyz;
171
-
172
- gl_Position = perspective * hPosition;
173
- }
174
- ''','''
175
- #version 130
176
- in vec3 vPosition;
177
- in vec3 vNormal;
178
- out vec4 fColor;
179
- uniform vec4 color;
180
- uniform vec3 light;
181
-
182
- float PhongIntensity(vec3 pos, vec3 norm) {
183
- vec3 N = normalize(norm);
184
- vec3 L = normalize(light - pos);
185
- vec3 E = normalize(pos);
186
- vec3 R = reflect(L, N);
187
-
188
- float diffuse = abs(dot(N, L));
189
- float specular = abs(dot(R, E));
190
-
191
- return clamp(pow(specular, 10) + diffuse, 0, 1);
192
- }
193
-
194
- void main() {
195
- float intensity = PhongIntensity(vPosition, vNormal);
196
-
197
- fColor = vec4(intensity * color.xyz, color.w);
198
- }
199
- ''')
200
- end
201
- end
202
-
203
- end
1
+ require_relative './native/opengl'
2
+
3
+ module RubyGL
4
+
5
+ class Shader
6
+ def initialize(vert_src, frag_src)
7
+ @v_shader_id = Native.glCreateShader(Native::GL_VERTEX_SHADER)
8
+ @f_shader_id = Native.glCreateShader(Native::GL_FRAGMENT_SHADER)
9
+ @attrib_locs, @uniform_locs = {}, {}
10
+
11
+ # Pointer Used To Point To The String Of Our Source Code
12
+ shader_src_ptr = FFI::MemoryPointer.new(:pointer)
13
+ shader_src_len = FFI::MemoryPointer.new(:int)
14
+
15
+ v_shader_ptr = FFI::MemoryPointer.from_string(vert_src)
16
+ f_shader_ptr = FFI::MemoryPointer.from_string(frag_src)
17
+
18
+ shader_src_ptr.write_pointer(v_shader_ptr.address)
19
+ shader_src_len.write_int(vert_src.size)
20
+ Native.glShaderSource(@v_shader_id, 1, shader_src_ptr, shader_src_len)
21
+
22
+ shader_src_ptr.write_pointer(f_shader_ptr.address)
23
+ shader_src_len.write_int(frag_src.size)
24
+ Native.glShaderSource(@f_shader_id, 1, shader_src_ptr, shader_src_len)
25
+
26
+ Native.glCompileShader(@v_shader_id)
27
+ Native.glCompileShader(@f_shader_id)
28
+
29
+ # Throw Exception With Compile Error If Compilation Failed
30
+ Shader.compile_status(@v_shader_id)
31
+ Shader.compile_status(@f_shader_id)
32
+
33
+ @program_id = Native.glCreateProgram()
34
+
35
+ Native.glAttachShader(@program_id, @v_shader_id)
36
+ Native.glAttachShader(@program_id, @f_shader_id)
37
+
38
+ Native.glLinkProgram(@program_id)
39
+
40
+ Shader.link_status(@program_id)
41
+ end
42
+
43
+ def use_program()
44
+ Native.glUseProgram(@program_id)
45
+ end
46
+
47
+ # Splat Operator Aggregates Incoming Parameters And Expands Outgoing Parameters
48
+ # If method_sym Does Not Accept A Pointer To The Data, Pass nil For data And
49
+ # Pass In The Normal Parameters Required For The Specific Method.
50
+ def send_uniform(method_sym, var_name, data = nil, *args)
51
+ loc = @uniform_locs[var_name] ||= uniform_location(var_name)
52
+
53
+ if data != nil then
54
+ data_ptr = FFI::MemoryPointer.new(:float, data.size)
55
+ data_ptr.write_array_of_float(data)
56
+
57
+ RubyGL::Native.send(method_sym, loc, *args, data_ptr)
58
+ else
59
+ RubyGL::Native.send(method_sym, loc, *args)
60
+ end
61
+ end
62
+
63
+ def attrib_location(var_name)
64
+ Native.glGetAttribLocation(@program_id, var_name)
65
+ end
66
+
67
+ private
68
+ def uniform_location(var_name)
69
+ Native.glGetUniformLocation(@program_id, var_name)
70
+ end
71
+
72
+ def self.compile_status(shader_id)
73
+ result = FFI::MemoryPointer.new(:int)
74
+ Native.glGetShaderiv(shader_id, Native::GL_COMPILE_STATUS, result)
75
+
76
+ if (result.get_int(0) != Native::GL_TRUE) then
77
+ Native.glGetShaderiv(shader_id, Native::GL_INFO_LOG_LENGTH, result)
78
+
79
+ compile_log = FFI::MemoryPointer.new(:char, result.get_int(0))
80
+
81
+ Native.glGetShaderInfoLog(shader_id, compile_log.total, FFI::MemoryPointer::NULL, compile_log)
82
+
83
+ raise compile_log.read_string_to_null()
84
+ end
85
+ end
86
+
87
+ def self.link_status(program_id)
88
+ result = FFI::MemoryPointer.new(:int)
89
+ Native.glGetProgramiv(program_id, Native::GL_LINK_STATUS, result)
90
+
91
+ if (result.get_int(0) != Native::GL_TRUE) then
92
+ Native.glGetProgramiv(program_id, Native::GL_INFO_LOG_LENGTH, result)
93
+
94
+ link_log = FFI::MemoryPointer.new(:char, result.get_int(0))
95
+
96
+ Native.glGetShaderInfoLog(program_id, link_log.total, FFI::MemoryPointer::NULL, link_log)
97
+
98
+ raise link_log.read_string_to_null()
99
+ end
100
+ end
101
+ end
102
+
103
+ class ShaderGenerator
104
+ def self.faceted_shader()
105
+ Shader.new('''
106
+ #version 130
107
+ in vec3 position;
108
+ out vec3 vPosition;
109
+ uniform mat4 modelview;
110
+ uniform mat4 perspective;
111
+
112
+ void main() {
113
+ vec4 hPosition = modelview * vec4(position, 1);
114
+ vPosition = hPosition.xyz;
115
+
116
+ gl_Position = perspective * hPosition;
117
+ }
118
+ ''','''
119
+ #version 130
120
+ in vec3 vPosition;
121
+ out vec4 fColor;
122
+ uniform vec4 color;
123
+ uniform vec3 light;
124
+
125
+ void main() {
126
+ vec3 dx = dFdy(vPosition);
127
+ vec3 dy = dFdx(vPosition);
128
+ vec3 triangle_norm = normalize(cross(dx, dy));
129
+ float factor = clamp(dot(triangle_norm, light), 0, 1);
130
+
131
+ fColor = vec4(color.xyz * factor, color.w);
132
+ }
133
+ ''')
134
+ end
135
+
136
+ def self.color_shader()
137
+ Shader.new('''
138
+ #version 130
139
+ in vec3 position;
140
+ uniform mat4 modelview;
141
+ uniform mat4 perspective;
142
+
143
+ void main() {
144
+ gl_Position = perspective * modelView * vec4(position, 1);
145
+ }
146
+ ''','''
147
+ #version 130
148
+ out vec4 fColor;
149
+ uniform vec4 color;
150
+
151
+ void main() {
152
+ fColor = color;
153
+ }
154
+ ''')
155
+ end
156
+
157
+ def self.phong_shader()
158
+ Shader.new('''
159
+ #version 130
160
+ in vec3 position;
161
+ in vec3 normal;
162
+ out vec3 vPosition;
163
+ out vec3 vNormal;
164
+ uniform mat4 modelview;
165
+ uniform mat4 perspective;
166
+
167
+ void main() {
168
+ vec4 hPosition = modelview * vec4(position, 1);
169
+ vPosition = hPosition.xyz;
170
+ vNormal = (modelview * vec4(normal, 1)).xyz;
171
+
172
+ gl_Position = perspective * hPosition;
173
+ }
174
+ ''','''
175
+ #version 130
176
+ in vec3 vPosition;
177
+ in vec3 vNormal;
178
+ out vec4 fColor;
179
+ uniform vec4 color;
180
+ uniform vec3 light;
181
+
182
+ float PhongIntensity(vec3 pos, vec3 norm) {
183
+ vec3 N = normalize(norm);
184
+ vec3 L = normalize(light - pos);
185
+ vec3 E = normalize(pos);
186
+ vec3 R = reflect(L, N);
187
+
188
+ float diffuse = abs(dot(N, L));
189
+ float specular = abs(dot(R, E));
190
+
191
+ return clamp(pow(specular, 10) + diffuse, 0, 1);
192
+ }
193
+
194
+ void main() {
195
+ float intensity = PhongIntensity(vPosition, vNormal);
196
+
197
+ fColor = vec4(intensity * color.xyz, color.w);
198
+ }
199
+ ''')
200
+ end
201
+ end
202
+
203
+ end
@@ -1,77 +1,77 @@
1
-
2
- module RubyGL
3
-
4
- class Util
5
- # Returns the value of the array at the overflow wrapped index value.
6
- def self.overflow_wrap(array, index)
7
- array[index % array.size]
8
- end
9
-
10
- # Returns [vertices, indices] where vertices is an array of unique vertices
11
- # corresponding to the vertices in vertex_array and indices is the zero based
12
- # index array that references the unqiue vertices stored in vertices.
13
- def self.gen_index_arrays(vertex_array, components)
14
- unique_points, point_indices, index_hash = [], [], {}
15
-
16
- curr_index = 0
17
- vertex_array.each_slice(components) { |point|
18
- index = index_hash[point]
19
-
20
- if index then
21
- point_indices.push(index)
22
- else
23
- unique_points.push(point)
24
- point_indices.push(curr_index)
25
-
26
- index_hash[point] = curr_index
27
- curr_index += 1
28
- end
29
- }
30
- unique_points.flatten!
31
-
32
- [unique_points, point_indices]
33
- end
34
-
35
-
36
- # Returns an array of vertex normals which is indexable by the indices array.
37
- # The components parameter should be the number of components per vertex for
38
- # each triangle.
39
- #
40
- # The vertices parameters must contain 3 component vertices or this function
41
- # will not be able to compute appropriate normals.
42
- def self.gen_vertex_normals(indices, vertices)
43
- normals = Array.new(vertices.size, Vec3.new)
44
-
45
- indices.each_slice(3) { |i1, i2, i3|
46
- # 3 Components Per Vertex (Index References 3 Components)
47
- adj_i1, adj_i2, adj_i3 = i1 * 3, i2 * 3, i3 * 3
48
-
49
- # Construct Triangle Vertices
50
- v1 = Vec3.new(vertices[adj_i1..adj_i1 + 2])
51
- v2 = Vec3.new(vertices[adj_i2..adj_i2 + 2])
52
- v3 = Vec3.new(vertices[adj_i3..adj_i3 + 2])
53
-
54
- d1 = v2 - v1
55
- d2 = v3 - v2
56
-
57
- normal = d1.cross(d2)
58
- normal.norm!
59
-
60
- normals[i1] += normal
61
- normals[i2] += normal
62
- normals[i3] += normal
63
- }
64
-
65
- # Normalize All Vectors And Convert From Vec3 To Flat Array
66
- normals.map! { |normal_vector|
67
- normal_vector.norm!
68
-
69
- normal_vector.to_a
70
- }
71
- normals.flatten!
72
-
73
- normals
74
- end
75
- end
76
-
77
- end
1
+
2
+ module RubyGL
3
+
4
+ class Util
5
+ # Returns the value of the array at the overflow wrapped index value.
6
+ def self.overflow_wrap(array, index)
7
+ array[index % array.size]
8
+ end
9
+
10
+ # Returns [vertices, indices] where vertices is an array of unique vertices
11
+ # corresponding to the vertices in vertex_array and indices is the zero based
12
+ # index array that references the unqiue vertices stored in vertices.
13
+ def self.gen_index_arrays(vertex_array, components)
14
+ unique_points, point_indices, index_hash = [], [], {}
15
+
16
+ curr_index = 0
17
+ vertex_array.each_slice(components) { |point|
18
+ index = index_hash[point]
19
+
20
+ if index then
21
+ point_indices.push(index)
22
+ else
23
+ unique_points.push(point)
24
+ point_indices.push(curr_index)
25
+
26
+ index_hash[point] = curr_index
27
+ curr_index += 1
28
+ end
29
+ }
30
+ unique_points.flatten!
31
+
32
+ [unique_points, point_indices]
33
+ end
34
+
35
+
36
+ # Returns an array of vertex normals which is indexable by the indices array.
37
+ # The components parameter should be the number of components per vertex for
38
+ # each triangle.
39
+ #
40
+ # The vertices parameters must contain 3 component vertices or this function
41
+ # will not be able to compute appropriate normals.
42
+ def self.gen_vertex_normals(indices, vertices)
43
+ normals = Array.new(vertices.size, Vec3.new)
44
+
45
+ indices.each_slice(3) { |i1, i2, i3|
46
+ # 3 Components Per Vertex (Index References 3 Components)
47
+ adj_i1, adj_i2, adj_i3 = i1 * 3, i2 * 3, i3 * 3
48
+
49
+ # Construct Triangle Vertices
50
+ v1 = Vec3.new(vertices[adj_i1..adj_i1 + 2])
51
+ v2 = Vec3.new(vertices[adj_i2..adj_i2 + 2])
52
+ v3 = Vec3.new(vertices[adj_i3..adj_i3 + 2])
53
+
54
+ d1 = v2 - v1
55
+ d2 = v3 - v2
56
+
57
+ normal = d1.cross(d2)
58
+ normal.norm!
59
+
60
+ normals[i1] += normal
61
+ normals[i2] += normal
62
+ normals[i3] += normal
63
+ }
64
+
65
+ # Normalize All Vectors And Convert From Vec3 To Flat Array
66
+ normals.map! { |normal_vector|
67
+ normal_vector.norm!
68
+
69
+ normal_vector.to_a
70
+ }
71
+ normals.flatten!
72
+
73
+ normals
74
+ end
75
+ end
76
+
77
+ end
data/lib/rubygl.rb CHANGED
@@ -1,48 +1,49 @@
1
- require 'ffi'
2
- require 'rbconfig'
3
-
4
- # OS Detection
5
- def os
6
- @os ||= (
7
- host_os = RbConfig::CONFIG['host_os']
8
-
9
- case host_os
10
- when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
11
- :windows
12
- when /darwin|mac os/
13
- :macosx
14
- when /linux/
15
- :linux
16
- when /solaris|bsd/
17
- :unix
18
- else
19
- raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
20
- end
21
- )
22
- end
23
-
24
- def relative_path(resource_path)
25
- File.join(File.dirname(File.expand_path(__FILE__)), resource_path)
26
- end
27
-
28
- # Initialize All Modules
29
- module RubyGL
30
- module Native
31
- extend FFI::Library
32
- ffi_lib relative_path("../ext/#{os.to_s}/SDL2.dll")
33
- ffi_lib relative_path("../ext/#{os.to_s}/RubyGL.so")
34
- end
35
- end
36
-
37
- # Load Module Code
38
- require_relative './rubygl/geometry'
39
- require_relative './rubygl/math'
40
- require_relative './rubygl/memory'
41
- require_relative './rubygl/setup'
42
- require_relative './rubygl/shader'
43
- require_relative './rubygl/util'
44
-
45
- require_relative './rubygl/native/window'
46
- require_relative './rubygl/native/glcontext'
47
- require_relative './rubygl/native/input'
48
- require_relative './rubygl/native/opengl'
1
+ require 'ffi'
2
+ require 'rbconfig'
3
+
4
+ # OS Detection
5
+ def os
6
+ @os ||= (
7
+ host_os = RbConfig::CONFIG['host_os']
8
+
9
+ case host_os
10
+ when /mswin|msys|mingw|cygwin|bccwin|wince|emc/
11
+ :windows
12
+ when /darwin|mac os/
13
+ :macosx
14
+ when /linux/
15
+ :linux
16
+ when /solaris|bsd/
17
+ :unix
18
+ else
19
+ raise Error::WebDriverError, "unknown os: #{host_os.inspect}"
20
+ end
21
+ )
22
+ end
23
+
24
+ def relative_path(resource_path)
25
+ File.join(File.dirname(File.expand_path(__FILE__)), resource_path)
26
+ end
27
+
28
+ # Initialize All Modules
29
+ module RubyGL
30
+ module Native
31
+ extend FFI::Library
32
+ ffi_lib relative_path("../ext/#{os.to_s}/SDL2.dll")
33
+ ffi_lib relative_path("../ext/#{os.to_s}/RubyGL.so")
34
+ end
35
+ end
36
+
37
+ # Load Module Code
38
+ require_relative './rubygl/event'
39
+ require_relative './rubygl/geometry'
40
+ require_relative './rubygl/math'
41
+ require_relative './rubygl/memory'
42
+ require_relative './rubygl/setup'
43
+ require_relative './rubygl/shader'
44
+ require_relative './rubygl/util'
45
+
46
+ require_relative './rubygl/native/window'
47
+ require_relative './rubygl/native/glcontext'
48
+ require_relative './rubygl/native/input'
49
+ require_relative './rubygl/native/opengl'