rubygl 0.1.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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
data/bin/ffi_code_gen.rb CHANGED
@@ -1,167 +1,167 @@
1
- require 'fileutils'
2
-
3
- def resolve_typedef(type, type_defs)
4
- while (type_defs[type]) do
5
- type = type_defs[type]
6
- end
7
-
8
- return type
9
- end
10
-
11
- def get_type(type, hash)
12
- hash[type]
13
- end
14
-
15
- def match_type(type, regex_hash)
16
- regex_hash.select { |key,val|
17
- type =~ key
18
- }.values[0]
19
- end
20
-
21
- def write_file(name, contents, mode = 'w+')
22
- File.open(name, mode) { |file|
23
- file << contents
24
- }
25
- end
26
-
27
- /--------------------------------START SCRIPT---------------------------------/
28
- # ARGV: [Object File] [Header File] [Ruby Source Name] [Library Name]
29
-
30
- SOURCE_INDENTS = 4
31
- FFI_TYPES = { 'char' => 'char', 'signed char' => 'char',
32
- 'unsigned char' => 'uchar', 'int8_t' => 'int8', 'uint8_t' => 'uint8',
33
- 'short' => 'short', 'unsigned short' => 'ushort', 'int16_t' => 'int16',
34
- 'uint16_t' => 'uint16', 'int' => 'int', 'unsigned int' => 'uint',
35
- 'int32_t' => 'int32', 'uint32_t' => 'uint32', 'long int' => 'long',
36
- 'unsigned long int' => 'ulong', 'int64_t' => 'int64', 'uint64_t' => 'uint64',
37
- 'long long int' => 'long_long', 'unsigned long long int' => 'ulong_long',
38
- 'float' => 'float', 'double' => 'double' }
39
- FFI_PTR_TYPES = { /\Aconst +(?:unsigned +)?char *\*\Z/ => 'string', /\*/ => 'pointer' }
40
-
41
- # Open Pre-Processor(ed) Source File
42
- source_code = ''
43
- File.open(ARGV[0]) { |file|
44
- source_code = file.read
45
- }
46
-
47
- # Associate Type Definitions With Their Actual Types
48
- typedef_hash = {}
49
- source_code.scan(/^typedef (.*?;)$/).flatten.each { |segment|
50
- segment.gsub!(/\*/, '* ')
51
-
52
- if (segment =~ /\(.*?\*.*?\)/) then # Function Pointer
53
- key = segment[/\* *(.*?) *\)/, 1]
54
-
55
- typedef_hash[key] = segment[0..-2] # Remove Semi-Colon
56
- else # Other Type
57
- key = segment[/([^ ]+);/, 1]
58
-
59
- typedef_hash[key] = segment[/(.*?) +[^ ]+;/, 1]
60
- end
61
- }
62
-
63
- # Open Header File
64
- source_code = ''
65
- File.open(ARGV[1]) { |file|
66
- source_code = file.read
67
- }
68
-
69
- # Associate Macros With Their Literal Types (OpenGL Enumerations)
70
- macro_tuples = []
71
- source_code.scan(/^#define GL_.+?$/i).each { |macro|
72
- token = macro[/^.+ +(.+) +.+$/, 1]
73
- value = macro[/^.+ +.+ +(.+)$/, 1]
74
- macro_tuples.push([token, value])
75
- }
76
-
77
- # Pull Out OpenGL Function Names From Header
78
- gl_functions = source_code.scan(/^.+?gl.+?\(.*?\);$/)
79
-
80
- ffi_template = "require 'ffi'
81
-
82
- module RubyGL::Native
83
- FUNCTIONS_GO_HERE
84
-
85
- CONSTANTS_GO_HERE
86
- end
87
- "
88
-
89
- # Append Functions (Param Type -> Typedefs -> Ruby Type)
90
- buffer = ''
91
- gl_functions.each { |signature|
92
- buffer << ' ' * SOURCE_INDENTS + 'attach_function :' +
93
- signature[/(gl.*?)\(.*?\);/, 1] + ', ['
94
-
95
- # Get Type List
96
- param_type_list = signature[/\((.*?)\);/, 1].split(', ').map { |full_param|
97
- full_param[/(.+) [[:alnum:]]+/, 1]
98
- }
99
-
100
- # Type Definition -> Primitive (Actual) Type
101
- param_type_list.map! { |param_type|
102
- # Parameter Type Could Use Multiple Type Definitions
103
-
104
- simple_param_types = param_type.gsub(/(?:\*|const)/, ' ').split(' ')
105
- # Translate Each Type And Put Back Into param_type
106
- simple_param_types.each { |simple_param_type|
107
- primitive_type = resolve_typedef(simple_param_type, typedef_hash)
108
-
109
- param_type.sub!(/#{simple_param_type}/, primitive_type)
110
- }
111
-
112
- param_type
113
- }
114
-
115
- # Primitive Type -> Ruby FFI Type
116
- param_type_list.each { |param_type|
117
- mutable_type = param_type.gsub(/const/, '').strip
118
-
119
- if (get_type(mutable_type, FFI_TYPES)) then
120
- param_type = get_type(mutable_type, FFI_TYPES)
121
- else
122
- param_type = match_type(param_type, FFI_PTR_TYPES)
123
- end
124
-
125
- # Write Out FFI Type
126
- buffer << ':' + param_type + ', '
127
- }
128
- if (buffer[-1] == '[') then # No Parameters
129
- buffer << '],'
130
- else # At Least One Parameter
131
- buffer[-2..-1] = '],'
132
- end
133
-
134
- # Get Return Type
135
- # We Do Not Care About const If We Can Match Our Return Type With A
136
- # Primitive Type. Otherwise, We Might Be Able To Match Against A
137
- # const char* Or const unsigned char* In Which Case We Prefer To Use A
138
- # string Type.
139
- return_type = signature[/(.*?) gl[^ ]+\(/, 1]
140
- mutable_return_type = return_type.gsub(/ *const */, '')
141
-
142
- mutable_return_type.gsub(/\*/, ' ').split(' ').each { |type|
143
- resolved_type = resolve_typedef(type, typedef_hash)
144
-
145
- mutable_return_type.sub!(/#{type}/, resolved_type)
146
- return_type.sub!(/#{type}/, resolved_type)
147
- }
148
-
149
- if (get_type(mutable_return_type, FFI_TYPES)) then
150
- return_type = get_type(mutable_return_type, FFI_TYPES)
151
- elsif (match_type(return_type, FFI_PTR_TYPES))
152
- return_type = match_type(return_type, FFI_PTR_TYPES)
153
- end
154
-
155
- buffer << ' :' + return_type + "\n"
156
- }
157
- ffi_template.sub!(/FUNCTIONS_GO_HERE/, buffer)
158
-
159
- # Append OpenGL Enumerations (Macros)
160
- buffer = ''
161
- macro_tuples.each { |name,val|
162
- buffer << ' ' * SOURCE_INDENTS + "#{name} = #{val}\n"
163
- }
164
- ffi_template.sub!(/CONSTANTS_GO_HERE/, buffer)
165
-
166
- write_file(ARGV[2], ffi_template)
1
+ require 'fileutils'
2
+
3
+ def resolve_typedef(type, type_defs)
4
+ while (type_defs[type]) do
5
+ type = type_defs[type]
6
+ end
7
+
8
+ return type
9
+ end
10
+
11
+ def get_type(type, hash)
12
+ hash[type]
13
+ end
14
+
15
+ def match_type(type, regex_hash)
16
+ regex_hash.select { |key,val|
17
+ type =~ key
18
+ }.values[0]
19
+ end
20
+
21
+ def write_file(name, contents, mode = 'w+')
22
+ File.open(name, mode) { |file|
23
+ file << contents
24
+ }
25
+ end
26
+
27
+ /--------------------------------START SCRIPT---------------------------------/
28
+ # ARGV: [Object File] [Header File] [Ruby Source Name] [Library Name]
29
+
30
+ SOURCE_INDENTS = 4
31
+ FFI_TYPES = { 'char' => 'char', 'signed char' => 'char',
32
+ 'unsigned char' => 'uchar', 'int8_t' => 'int8', 'uint8_t' => 'uint8',
33
+ 'short' => 'short', 'unsigned short' => 'ushort', 'int16_t' => 'int16',
34
+ 'uint16_t' => 'uint16', 'int' => 'int', 'unsigned int' => 'uint',
35
+ 'int32_t' => 'int32', 'uint32_t' => 'uint32', 'long int' => 'long',
36
+ 'unsigned long int' => 'ulong', 'int64_t' => 'int64', 'uint64_t' => 'uint64',
37
+ 'long long int' => 'long_long', 'unsigned long long int' => 'ulong_long',
38
+ 'float' => 'float', 'double' => 'double' }
39
+ FFI_PTR_TYPES = { /\Aconst +(?:unsigned +)?char *\*\Z/ => 'string', /\*/ => 'pointer' }
40
+
41
+ # Open Pre-Processor(ed) Source File
42
+ source_code = ''
43
+ File.open(ARGV[0]) { |file|
44
+ source_code = file.read
45
+ }
46
+
47
+ # Associate Type Definitions With Their Actual Types
48
+ typedef_hash = {}
49
+ source_code.scan(/^typedef (.*?;)$/).flatten.each { |segment|
50
+ segment.gsub!(/\*/, '* ')
51
+
52
+ if (segment =~ /\(.*?\*.*?\)/) then # Function Pointer
53
+ key = segment[/\* *(.*?) *\)/, 1]
54
+
55
+ typedef_hash[key] = segment[0..-2] # Remove Semi-Colon
56
+ else # Other Type
57
+ key = segment[/([^ ]+);/, 1]
58
+
59
+ typedef_hash[key] = segment[/(.*?) +[^ ]+;/, 1]
60
+ end
61
+ }
62
+
63
+ # Open Header File
64
+ source_code = ''
65
+ File.open(ARGV[1]) { |file|
66
+ source_code = file.read
67
+ }
68
+
69
+ # Associate Macros With Their Literal Types (OpenGL Enumerations)
70
+ macro_tuples = []
71
+ source_code.scan(/^#define GL_.+?$/i).each { |macro|
72
+ token = macro[/^.+ +(.+) +.+$/, 1]
73
+ value = macro[/^.+ +.+ +(.+)$/, 1]
74
+ macro_tuples.push([token, value])
75
+ }
76
+
77
+ # Pull Out OpenGL Function Names From Header
78
+ gl_functions = source_code.scan(/^.+?gl.+?\(.*?\);$/)
79
+
80
+ ffi_template = "require 'ffi'
81
+
82
+ module RubyGL::Native
83
+ FUNCTIONS_GO_HERE
84
+
85
+ CONSTANTS_GO_HERE
86
+ end
87
+ "
88
+
89
+ # Append Functions (Param Type -> Typedefs -> Ruby Type)
90
+ buffer = ''
91
+ gl_functions.each { |signature|
92
+ buffer << ' ' * SOURCE_INDENTS + 'attach_function :' +
93
+ signature[/(gl.*?)\(.*?\);/, 1] + ', ['
94
+
95
+ # Get Type List
96
+ param_type_list = signature[/\((.*?)\);/, 1].split(', ').map { |full_param|
97
+ full_param[/(.+) [[:alnum:]]+/, 1]
98
+ }
99
+
100
+ # Type Definition -> Primitive (Actual) Type
101
+ param_type_list.map! { |param_type|
102
+ # Parameter Type Could Use Multiple Type Definitions
103
+
104
+ simple_param_types = param_type.gsub(/(?:\*|const)/, ' ').split(' ')
105
+ # Translate Each Type And Put Back Into param_type
106
+ simple_param_types.each { |simple_param_type|
107
+ primitive_type = resolve_typedef(simple_param_type, typedef_hash)
108
+
109
+ param_type.sub!(/#{simple_param_type}/, primitive_type)
110
+ }
111
+
112
+ param_type
113
+ }
114
+
115
+ # Primitive Type -> Ruby FFI Type
116
+ param_type_list.each { |param_type|
117
+ mutable_type = param_type.gsub(/const/, '').strip
118
+
119
+ if (get_type(mutable_type, FFI_TYPES)) then
120
+ param_type = get_type(mutable_type, FFI_TYPES)
121
+ else
122
+ param_type = match_type(param_type, FFI_PTR_TYPES)
123
+ end
124
+
125
+ # Write Out FFI Type
126
+ buffer << ':' + param_type + ', '
127
+ }
128
+ if (buffer[-1] == '[') then # No Parameters
129
+ buffer << '],'
130
+ else # At Least One Parameter
131
+ buffer[-2..-1] = '],'
132
+ end
133
+
134
+ # Get Return Type
135
+ # We Do Not Care About const If We Can Match Our Return Type With A
136
+ # Primitive Type. Otherwise, We Might Be Able To Match Against A
137
+ # const char* Or const unsigned char* In Which Case We Prefer To Use A
138
+ # string Type.
139
+ return_type = signature[/(.*?) gl[^ ]+\(/, 1]
140
+ mutable_return_type = return_type.gsub(/ *const */, '')
141
+
142
+ mutable_return_type.gsub(/\*/, ' ').split(' ').each { |type|
143
+ resolved_type = resolve_typedef(type, typedef_hash)
144
+
145
+ mutable_return_type.sub!(/#{type}/, resolved_type)
146
+ return_type.sub!(/#{type}/, resolved_type)
147
+ }
148
+
149
+ if (get_type(mutable_return_type, FFI_TYPES)) then
150
+ return_type = get_type(mutable_return_type, FFI_TYPES)
151
+ elsif (match_type(return_type, FFI_PTR_TYPES))
152
+ return_type = match_type(return_type, FFI_PTR_TYPES)
153
+ end
154
+
155
+ buffer << ' :' + return_type + "\n"
156
+ }
157
+ ffi_template.sub!(/FUNCTIONS_GO_HERE/, buffer)
158
+
159
+ # Append OpenGL Enumerations (Macros)
160
+ buffer = ''
161
+ macro_tuples.each { |name,val|
162
+ buffer << ' ' * SOURCE_INDENTS + "#{name} = #{val}\n"
163
+ }
164
+ ffi_template.sub!(/CONSTANTS_GO_HERE/, buffer)
165
+
166
+ write_file(ARGV[2], ffi_template)
167
167
  /---------------------------------END SCRIPT----------------------------------/