cyberarm_engine 0.13.0 → 0.17.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.rubocop.yml +8 -0
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/LICENSE.txt +21 -21
  7. data/README.md +73 -43
  8. data/Rakefile +10 -10
  9. data/assets/textures/default.png +0 -0
  10. data/bin/console +14 -14
  11. data/bin/setup +8 -8
  12. data/cyberarm_engine.gemspec +39 -36
  13. data/lib/cyberarm_engine.rb +64 -47
  14. data/lib/cyberarm_engine/animator.rb +56 -54
  15. data/lib/cyberarm_engine/background.rb +179 -175
  16. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  17. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  18. data/lib/cyberarm_engine/cache.rb +4 -0
  19. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  20. data/lib/cyberarm_engine/common.rb +96 -96
  21. data/lib/cyberarm_engine/config_file.rb +46 -0
  22. data/lib/cyberarm_engine/game_object.rb +248 -257
  23. data/lib/cyberarm_engine/game_state.rb +92 -89
  24. data/lib/cyberarm_engine/model.rb +207 -0
  25. data/lib/cyberarm_engine/model/material.rb +21 -0
  26. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  27. data/lib/cyberarm_engine/model/parser.rb +74 -0
  28. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  29. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  30. data/lib/cyberarm_engine/model_cache.rb +31 -0
  31. data/lib/cyberarm_engine/opengl.rb +28 -0
  32. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  33. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  34. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  35. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  36. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  37. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  38. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  39. data/lib/cyberarm_engine/opengl/shader.rb +406 -0
  40. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  41. data/lib/cyberarm_engine/ray.rb +56 -56
  42. data/lib/cyberarm_engine/stats.rb +21 -0
  43. data/lib/cyberarm_engine/text.rb +160 -146
  44. data/lib/cyberarm_engine/timer.rb +23 -23
  45. data/lib/cyberarm_engine/transform.rb +296 -273
  46. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -101
  47. data/lib/cyberarm_engine/ui/dsl.rb +138 -99
  48. data/lib/cyberarm_engine/ui/element.rb +315 -276
  49. data/lib/cyberarm_engine/ui/elements/button.rb +160 -67
  50. data/lib/cyberarm_engine/ui/elements/check_box.rb +51 -59
  51. data/lib/cyberarm_engine/ui/elements/container.rb +256 -176
  52. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  53. data/lib/cyberarm_engine/ui/elements/edit_line.rb +262 -172
  54. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -17
  55. data/lib/cyberarm_engine/ui/elements/image.rb +72 -52
  56. data/lib/cyberarm_engine/ui/elements/label.rb +156 -50
  57. data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -0
  58. data/lib/cyberarm_engine/ui/elements/progress.rb +51 -50
  59. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
  60. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
  61. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -13
  62. data/lib/cyberarm_engine/ui/elements/text_block.rb +156 -0
  63. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +65 -56
  64. data/lib/cyberarm_engine/ui/event.rb +47 -47
  65. data/lib/cyberarm_engine/ui/gui_state.rb +226 -135
  66. data/lib/cyberarm_engine/ui/style.rb +38 -37
  67. data/lib/cyberarm_engine/ui/theme.rb +182 -120
  68. data/lib/cyberarm_engine/vector.rb +293 -203
  69. data/lib/cyberarm_engine/version.rb +4 -4
  70. data/lib/cyberarm_engine/{engine.rb → window.rb} +114 -101
  71. metadata +88 -18
  72. data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
  73. data/lib/cyberarm_engine/shader.rb +0 -262
@@ -1,262 +0,0 @@
1
- module CyberarmEngine
2
- # Ref: https://github.com/vaiorabbit/ruby-opengl/blob/master/sample/OrangeBook/brick.rb
3
- class Shader
4
- include OpenGL
5
- @@shaders = {}
6
- PREPROCESSOR_CHARACTER = "@"
7
-
8
- def self.add(name, instance)
9
- @@shaders[name] = instance
10
- end
11
-
12
- def self.use(name, &block)
13
- shader = @@shaders.dig(name)
14
- if shader
15
- shader.use(&block)
16
- else
17
- raise ArgumentError, "Shader '#{name}' not found!"
18
- end
19
- end
20
-
21
- def self.available?(name)
22
- @@shaders.dig(name).is_a?(Shader)
23
- end
24
-
25
- def self.get(name)
26
- @@shaders.dig(name)
27
- end
28
-
29
- def self.active_shader
30
- @active_shader
31
- end
32
-
33
- def self.active_shader=(instance)
34
- @active_shader = instance
35
- end
36
-
37
- def self.stop
38
- shader = Shader.active_shader
39
-
40
- if shader
41
- shader.stop
42
- else
43
- raise ArgumentError, "No active shader to stop!"
44
- end
45
- end
46
-
47
- def self.attribute_location(variable)
48
- raise RuntimeError, "No active shader!" unless Shader.active_shader
49
- Shader.active_shader.attribute_location(variable)
50
- end
51
-
52
- def self.set_uniform(variable, value)
53
- raise RuntimeError, "No active shader!" unless Shader.active_shader
54
- Shader.active_shader.set_uniform(variable, value)
55
- end
56
-
57
- attr_reader :name, :program
58
- def initialize(name:, includes_dir: nil, vertex: "shaders/default.vert", fragment:)
59
- raise "Shader name can not be blank" if name.length == 0
60
-
61
- @name = name
62
- @includes_dir = includes_dir
63
- @compiled = false
64
-
65
- @program = nil
66
-
67
- @error_buffer_size = 1024
68
- @variable_missing = {}
69
-
70
- @data = {shaders: {}}
71
-
72
- unless shader_files_exist?(vertex: vertex, fragment: fragment)
73
- raise ArgumentError, "Shader files not found: #{vertex} or #{fragment}"
74
- end
75
-
76
- create_shader(type: :vertex, source: File.read(vertex))
77
- create_shader(type: :fragment, source: File.read(fragment))
78
-
79
- compile_shader(type: :vertex)
80
- compile_shader(type: :fragment)
81
- link_shaders
82
-
83
- # Only add shader if it successfully compiles
84
- if @compiled
85
- puts "compiled!"
86
- puts "Compiled shader: #{@name}"
87
- Shader.add(@name, self)
88
- else
89
- warn "FAILED to compile shader: #{@name}", ""
90
- end
91
- end
92
-
93
- def shader_files_exist?(vertex:, fragment:)
94
- File.exist?(vertex) && File.exist?(fragment)
95
- end
96
-
97
- def create_shader(type:, source:)
98
- _shader = nil
99
-
100
- case type
101
- when :vertex
102
- _shader = glCreateShader(GL_VERTEX_SHADER)
103
- when :fragment
104
- _shader = glCreateShader(GL_FRAGMENT_SHADER)
105
- else
106
- warn "Unsupported shader type: #{type.inspect}"
107
- end
108
-
109
- processed_source = preprocess_source(source: source)
110
-
111
- _source = [processed_source].pack("p")
112
- _size = [processed_source.length].pack("I")
113
- glShaderSource(_shader, 1, _source, _size)
114
-
115
- @data[:shaders][type] =_shader
116
- end
117
-
118
- def preprocess_source(source:)
119
- lines = source.lines
120
-
121
- lines.each_with_index do |line, i|
122
- if line.start_with?(PREPROCESSOR_CHARACTER)
123
- preprocessor = line.strip.split(" ")
124
- lines.delete(line)
125
-
126
- case preprocessor.first
127
- when "@include"
128
- raise ArgumentError, "Shader preprocessor include directory was not given for shader #{@name}" unless @includes_dir
129
-
130
- preprocessor[1..preprocessor.length - 1].join.scan(/"([^"]*)"/).flatten.each do |file|
131
- source = File.read("#{@includes_dir}/#{file}.glsl")
132
-
133
- lines.insert(i, source)
134
- end
135
- else
136
- warn "Unsupported preprocessor #{preprocessor.first} for #{@name}"
137
- end
138
- end
139
- end
140
-
141
- lines.join
142
- end
143
-
144
- def compile_shader(type:)
145
- _compiled = false
146
- _shader = @data[:shaders][type]
147
- raise ArgumentError, "No shader for #{type.inspect}" unless _shader
148
-
149
- glCompileShader(_shader)
150
- buffer = ' '
151
- glGetShaderiv(_shader, GL_COMPILE_STATUS, buffer)
152
- compiled = buffer.unpack('L')[0]
153
-
154
- if compiled == 0
155
- log = ' ' * @error_buffer_size
156
- glGetShaderInfoLog(_shader, @error_buffer_size, nil, log)
157
- puts "Shader Error: Program \"#{@name}\""
158
- puts " #{type.to_s.capitalize} Shader InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
159
- puts " Shader Compiled status: #{compiled}"
160
- puts " NOTE: assignment of uniforms in shaders is illegal!"
161
- puts
162
- else
163
- _compiled = true
164
- end
165
-
166
- return _compiled
167
- end
168
-
169
- def link_shaders
170
- @program = glCreateProgram
171
- @data[:shaders].values.each do |_shader|
172
- glAttachShader(@program, _shader)
173
- end
174
- glLinkProgram(@program)
175
-
176
- buffer = ' '
177
- glGetProgramiv(@program, GL_LINK_STATUS, buffer)
178
- linked = buffer.unpack('L')[0]
179
-
180
- if linked == 0
181
- log = ' ' * @error_buffer_size
182
- glGetProgramInfoLog(@program, @error_buffer_size, nil, log)
183
- puts "Shader Error: Program \"#{@name}\""
184
- puts " Program InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
185
- end
186
-
187
- @compiled = linked == 0 ? false : true
188
- end
189
-
190
- # Returns the location of a uniform variable
191
- def variable(variable)
192
- loc = glGetUniformLocation(@program, variable)
193
- if (loc == -1)
194
- puts "Shader Error: Program \"#{@name}\" has no such uniform named \"#{variable}\"", " Is it used in the shader? GLSL may have optimized it out.", " Is it miss spelled?" unless @variable_missing[variable]
195
- @variable_missing[variable] = true
196
- end
197
- return loc
198
- end
199
-
200
- def use(&block)
201
- return unless compiled?
202
- raise "Another shader is already in use! #{Shader.active_shader.name.inspect}" if Shader.active_shader
203
- Shader.active_shader=self
204
-
205
- glUseProgram(@program)
206
-
207
- if block
208
- block.call(self)
209
- stop
210
- end
211
- end
212
-
213
- def stop
214
- Shader.active_shader = nil if Shader.active_shader == self
215
- glUseProgram(0)
216
- end
217
-
218
- def compiled?
219
- @compiled
220
- end
221
-
222
- def attribute_location(variable)
223
- glGetUniformLocation(@program, variable)
224
- end
225
-
226
- def uniform_transform(variable, value, location = nil)
227
- attr_loc = location ? location : attribute_location(variable)
228
-
229
- glUniformMatrix4fv(attr_loc, 1, GL_FALSE, value.to_gl.pack("F16"))
230
- end
231
-
232
- def uniform_boolean(variable, value, location = nil)
233
- attr_loc = location ? location : attribute_location(variable)
234
-
235
- glUniform1i(attr_loc, value ? 1 : 0)
236
- end
237
-
238
- def uniform_integer(variable, value, location = nil)
239
- attr_loc = location ? location : attribute_location(variable)
240
-
241
- glUniform1i(attr_loc, value)
242
- end
243
-
244
- def uniform_float(variable, value, location = nil)
245
- attr_loc = location ? location : attribute_location(variable)
246
-
247
- glUniform1f(attr_loc, value)
248
- end
249
-
250
- def uniform_vec3(variable, value, location = nil)
251
- attr_loc = location ? location : attribute_location(variable)
252
-
253
- glUniform3f(attr_loc, *value.to_a[0..2])
254
- end
255
-
256
- def uniform_vec4(variable, value, location = nil)
257
- attr_loc = location ? location : attribute_location(variable)
258
-
259
- glUniform4f(attr_loc, *value.to_a)
260
- end
261
- end
262
- end