cyberarm_engine 0.13.1 → 0.17.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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/README.md +1 -1
  5. data/Rakefile +1 -1
  6. data/assets/textures/default.png +0 -0
  7. data/cyberarm_engine.gemspec +12 -9
  8. data/lib/cyberarm_engine.rb +20 -5
  9. data/lib/cyberarm_engine/animator.rb +6 -4
  10. data/lib/cyberarm_engine/background.rb +19 -15
  11. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  12. data/lib/cyberarm_engine/bounding_box.rb +18 -18
  13. data/lib/cyberarm_engine/cache.rb +4 -0
  14. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  15. data/lib/cyberarm_engine/common.rb +16 -16
  16. data/lib/cyberarm_engine/config_file.rb +2 -2
  17. data/lib/cyberarm_engine/game_object.rb +63 -72
  18. data/lib/cyberarm_engine/game_state.rb +6 -3
  19. data/lib/cyberarm_engine/model.rb +207 -0
  20. data/lib/cyberarm_engine/model/material.rb +21 -0
  21. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  22. data/lib/cyberarm_engine/model/parser.rb +74 -0
  23. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  24. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  25. data/lib/cyberarm_engine/model_cache.rb +31 -0
  26. data/lib/cyberarm_engine/opengl.rb +28 -0
  27. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  28. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  29. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  30. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  31. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  32. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  33. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  34. data/lib/cyberarm_engine/{shader.rb → opengl/shader.rb} +51 -43
  35. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  36. data/lib/cyberarm_engine/ray.rb +5 -5
  37. data/lib/cyberarm_engine/stats.rb +21 -0
  38. data/lib/cyberarm_engine/text.rb +45 -31
  39. data/lib/cyberarm_engine/timer.rb +1 -1
  40. data/lib/cyberarm_engine/transform.rb +43 -20
  41. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  42. data/lib/cyberarm_engine/ui/dsl.rb +49 -10
  43. data/lib/cyberarm_engine/ui/element.rb +73 -21
  44. data/lib/cyberarm_engine/ui/elements/button.rb +121 -28
  45. data/lib/cyberarm_engine/ui/elements/check_box.rb +25 -33
  46. data/lib/cyberarm_engine/ui/elements/container.rb +113 -33
  47. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  48. data/lib/cyberarm_engine/ui/elements/edit_line.rb +145 -45
  49. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
  50. data/lib/cyberarm_engine/ui/elements/image.rb +32 -12
  51. data/lib/cyberarm_engine/ui/elements/label.rb +122 -16
  52. data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -0
  53. data/lib/cyberarm_engine/ui/elements/progress.rb +6 -5
  54. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
  55. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
  56. data/lib/cyberarm_engine/ui/elements/stack.rb +1 -3
  57. data/lib/cyberarm_engine/ui/elements/text_block.rb +156 -0
  58. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
  59. data/lib/cyberarm_engine/ui/event.rb +7 -7
  60. data/lib/cyberarm_engine/ui/gui_state.rb +118 -6
  61. data/lib/cyberarm_engine/ui/style.rb +10 -9
  62. data/lib/cyberarm_engine/ui/theme.rb +84 -22
  63. data/lib/cyberarm_engine/vector.rb +33 -30
  64. data/lib/cyberarm_engine/version.rb +2 -2
  65. data/lib/cyberarm_engine/{engine.rb → window.rb} +32 -19
  66. metadata +87 -18
  67. data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
@@ -0,0 +1,289 @@
1
+ module CyberarmEngine
2
+ class OpenGLRenderer
3
+ @@immediate_mode_warning = false
4
+
5
+ attr_accessor :show_wireframe
6
+
7
+ def initialize(width:, height:, show_wireframe: false)
8
+ @width = width
9
+ @height = height
10
+ @show_wireframe = show_wireframe
11
+
12
+ @g_buffer = GBuffer.new(width: @width, height: @height)
13
+ end
14
+
15
+ def canvas_size_changed
16
+ @g_buffer.unbind_framebuffer
17
+ @g_buffer.clean_up
18
+
19
+ @g_buffer = GBuffer.new(width: @width, height: @height)
20
+ end
21
+
22
+ def render(camera, lights, entities)
23
+ glViewport(0, 0, @width, @height)
24
+ glEnable(GL_DEPTH_TEST)
25
+
26
+ if Shader.available?("g_buffer") && Shader.available?("lighting")
27
+ @g_buffer.bind_for_writing
28
+ gl_error?
29
+
30
+ glClearColor(0.0, 0.0, 0.0, 0.0)
31
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
32
+
33
+ Shader.use("g_buffer") do |shader|
34
+ gl_error?
35
+
36
+ entities.each do |entity|
37
+ next unless entity.visible && entity.renderable
38
+
39
+ shader.uniform_transform("projection", camera.projection_matrix)
40
+ shader.uniform_transform("view", camera.view_matrix)
41
+ shader.uniform_transform("model", entity.model_matrix)
42
+ shader.uniform_vec3("cameraPosition", camera.position)
43
+
44
+ gl_error?
45
+ draw_model(entity.model, shader)
46
+ entity.draw
47
+ end
48
+ end
49
+
50
+ @g_buffer.unbind_framebuffer
51
+ gl_error?
52
+
53
+ @g_buffer.bind_for_reading
54
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)
55
+
56
+ lighting(lights)
57
+ gl_error?
58
+
59
+ post_processing
60
+ gl_error?
61
+
62
+ # render_framebuffer
63
+ gl_error?
64
+
65
+ @g_buffer.unbind_framebuffer
66
+ gl_error?
67
+ else
68
+ unless @@immediate_mode_warning
69
+ puts "Shaders are disabled or failed to compile, using immediate mode for rendering..."
70
+ end
71
+ @@immediate_mode_warning = true
72
+
73
+ gl_error?
74
+ lights.each(&:draw)
75
+ camera.draw
76
+
77
+ glEnable(GL_NORMALIZE)
78
+ entities.each do |entity|
79
+ next unless entity.visible && entity.renderable
80
+
81
+ glPushMatrix
82
+
83
+ glTranslatef(entity.position.x, entity.position.y, entity.position.z)
84
+ glScalef(entity.scale.x, entity.scale.y, entity.scale.z)
85
+ glRotatef(entity.orientation.x, 1.0, 0, 0)
86
+ glRotatef(entity.orientation.y, 0, 1.0, 0)
87
+ glRotatef(entity.orientation.z, 0, 0, 1.0)
88
+
89
+ gl_error?
90
+ draw_mesh(entity.model)
91
+ entity.draw
92
+ glPopMatrix
93
+ end
94
+ end
95
+
96
+ gl_error?
97
+ end
98
+
99
+ def copy_g_buffer_to_screen
100
+ @g_buffer.set_read_buffer(:position)
101
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
102
+ 0, 0, @g_buffer.width / 2, @g_buffer.height / 2,
103
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
104
+
105
+ @g_buffer.set_read_buffer(:diffuse)
106
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
107
+ 0, @g_buffer.height / 2, @g_buffer.width / 2, @g_buffer.height,
108
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
109
+
110
+ @g_buffer.set_read_buffer(:normal)
111
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
112
+ @g_buffer.width / 2, @g_buffer.height / 2, @g_buffer.width, @g_buffer.height,
113
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
114
+
115
+ @g_buffer.set_read_buffer(:texcoord)
116
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
117
+ @g_buffer.width / 2, 0, @g_buffer.width, @g_buffer.height / 2,
118
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
119
+ end
120
+
121
+ def lighting(lights)
122
+ Shader.use("lighting") do |shader|
123
+ glBindVertexArray(@g_buffer.screen_vbo)
124
+
125
+ glDisable(GL_DEPTH_TEST)
126
+ glEnable(GL_BLEND)
127
+
128
+ glActiveTexture(GL_TEXTURE0)
129
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
130
+ shader.uniform_integer("diffuse", 0)
131
+
132
+ glActiveTexture(GL_TEXTURE1)
133
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:position))
134
+ shader.uniform_integer("position", 1)
135
+
136
+ glActiveTexture(GL_TEXTURE2)
137
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:texcoord))
138
+ shader.uniform_integer("texcoord", 2)
139
+
140
+ glActiveTexture(GL_TEXTURE3)
141
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:normal))
142
+ shader.uniform_integer("normal", 3)
143
+
144
+ glActiveTexture(GL_TEXTURE4)
145
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:depth))
146
+ shader.uniform_integer("depth", 4)
147
+
148
+ lights.each_with_index do |light, _i|
149
+ shader.uniform_integer("light[0].type", light.type)
150
+ shader.uniform_vec3("light[0].direction", light.direction)
151
+ shader.uniform_vec3("light[0].position", light.position)
152
+ shader.uniform_vec3("light[0].diffuse", light.diffuse)
153
+ shader.uniform_vec3("light[0].ambient", light.ambient)
154
+ shader.uniform_vec3("light[0].specular", light.specular)
155
+
156
+ glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
157
+ end
158
+
159
+ glBindVertexArray(0)
160
+ end
161
+ end
162
+
163
+ def post_processing
164
+ end
165
+
166
+ def render_framebuffer
167
+ if Shader.available?("lighting")
168
+ Shader.use("lighting") do |shader|
169
+ glBindVertexArray(@g_buffer.screen_vbo)
170
+
171
+ glDisable(GL_DEPTH_TEST)
172
+ glEnable(GL_BLEND)
173
+
174
+ glActiveTexture(GL_TEXTURE0)
175
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
176
+ shader.uniform_integer("diffuse_texture", 0)
177
+
178
+ glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
179
+
180
+ glBindVertexArray(0)
181
+ end
182
+ end
183
+ end
184
+
185
+ def draw_model(model, shader)
186
+ glBindVertexArray(model.vertex_array_id)
187
+ glEnableVertexAttribArray(0)
188
+ glEnableVertexAttribArray(1)
189
+ glEnableVertexAttribArray(2)
190
+ if model.has_texture?
191
+ glEnableVertexAttribArray(3)
192
+ glEnableVertexAttribArray(4)
193
+ end
194
+
195
+ if @show_wireframe
196
+ glLineWidth(2)
197
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
198
+ Shader.active_shader.uniform_boolean("disableLighting", true)
199
+
200
+ glDrawArrays(GL_TRIANGLES, 0, model.faces.count * 3)
201
+
202
+ Shader.active_shader.uniform_boolean("disableLighting", false)
203
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
204
+ glLineWidth(1)
205
+ end
206
+
207
+ offset = 0
208
+ model.objects.each do |object|
209
+ shader.uniform_boolean("hasTexture", object.has_texture?)
210
+
211
+ if object.has_texture?
212
+ glBindTexture(GL_TEXTURE_2D, object.materials.find { |mat| mat.texture_id }.texture_id)
213
+ else
214
+ glBindTexture(GL_TEXTURE_2D, 0)
215
+ end
216
+
217
+ glDrawArrays(GL_TRIANGLES, offset, object.faces.count * 3)
218
+ offset += object.faces.count * 3
219
+ end
220
+
221
+ if model.has_texture?
222
+ glDisableVertexAttribArray(4)
223
+ glDisableVertexAttribArray(3)
224
+
225
+ glBindTexture(GL_TEXTURE_2D, 0)
226
+ end
227
+ glDisableVertexAttribArray(2)
228
+ glDisableVertexAttribArray(1)
229
+ glDisableVertexAttribArray(0)
230
+
231
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
232
+ glBindVertexArray(0)
233
+ end
234
+
235
+ def draw_mesh(model)
236
+ model.objects.each_with_index do |o, _i|
237
+ glEnable(GL_COLOR_MATERIAL)
238
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
239
+ glShadeModel(GL_FLAT) unless o.faces.first[4]
240
+ glShadeModel(GL_SMOOTH) if o.faces.first[4]
241
+ glEnableClientState(GL_VERTEX_ARRAY)
242
+ glEnableClientState(GL_COLOR_ARRAY)
243
+ glEnableClientState(GL_NORMAL_ARRAY)
244
+
245
+ if o.has_texture?
246
+ glEnable(GL_TEXTURE_2D)
247
+ glBindTexture(GL_TEXTURE_2D, o.materials.find { |mat| mat.texture_id }.texture_id)
248
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY)
249
+ glTexCoordPointer(3, GL_FLOAT, 0, o.flattened_uvs)
250
+ end
251
+
252
+ glVertexPointer(4, GL_FLOAT, 0, o.flattened_vertices)
253
+ glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
254
+ glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
255
+
256
+ if @show_wireframe # This is kinda expensive
257
+ glDisable(GL_LIGHTING)
258
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
259
+ glPolygonOffset(2, 0.5)
260
+ glLineWidth(3)
261
+
262
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
263
+
264
+ glLineWidth(1)
265
+ glPolygonOffset(0, 0)
266
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
267
+ glEnable(GL_LIGHTING)
268
+
269
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
270
+ else
271
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
272
+ end
273
+
274
+ # glBindBuffer(GL_ARRAY_BUFFER, 0)
275
+
276
+ glDisableClientState(GL_VERTEX_ARRAY)
277
+ glDisableClientState(GL_COLOR_ARRAY)
278
+ glDisableClientState(GL_NORMAL_ARRAY)
279
+
280
+ if o.has_texture?
281
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY)
282
+ glDisable(GL_TEXTURE_2D)
283
+ end
284
+
285
+ glDisable(GL_COLOR_MATERIAL)
286
+ end
287
+ end
288
+ end
289
+ end
@@ -0,0 +1,22 @@
1
+ module CyberarmEngine
2
+ class Renderer
3
+ attr_reader :opengl_renderer, :bounding_box_renderer
4
+
5
+ def initialize
6
+ @bounding_box_renderer = BoundingBoxRenderer.new
7
+ @opengl_renderer = OpenGLRenderer.new(width: $window.width, height: $window.height)
8
+ end
9
+
10
+ def draw(camera, lights, entities)
11
+ @opengl_renderer.render(camera, lights, entities)
12
+ @bounding_box_renderer.render(entities) if @show_bounding_boxes
13
+ end
14
+
15
+ def canvas_size_changed
16
+ @opengl_renderer.canvas_size_changed
17
+ end
18
+
19
+ def finalize # cleanup
20
+ end
21
+ end
22
+ end
@@ -22,9 +22,7 @@ module CyberarmEngine
22
22
  if shader
23
23
  @@shaders.delete(name)
24
24
 
25
- if shader.compiled?
26
- glDeleteProgram(shader.program)
27
- end
25
+ glDeleteProgram(shader.program) if shader.compiled?
28
26
  end
29
27
  end
30
28
 
@@ -68,15 +66,15 @@ module CyberarmEngine
68
66
  # returns currently active {Shader}, if one is active
69
67
  #
70
68
  # @return [Shader?]
71
- def self.active_shader
72
- @active_shader
69
+ class << self
70
+ attr_reader :active_shader
73
71
  end
74
72
 
75
73
  # sets currently active {Shader}
76
74
  #
77
75
  # @param instance [Shader] instance of {Shader} to set as active
78
- def self.active_shader=(instance)
79
- @active_shader = instance
76
+ class << self
77
+ attr_writer :active_shader
80
78
  end
81
79
 
82
80
  # stops using currently active {Shader}
@@ -94,7 +92,8 @@ module CyberarmEngine
94
92
  #
95
93
  # @param variable [String]
96
94
  def self.attribute_location(variable)
97
- raise RuntimeError, "No active shader!" unless Shader.active_shader
95
+ raise "No active shader!" unless Shader.active_shader
96
+
98
97
  Shader.active_shader.attribute_location(variable)
99
98
  end
100
99
 
@@ -103,12 +102,14 @@ module CyberarmEngine
103
102
  # @param variable [String]
104
103
  # @param value
105
104
  def self.set_uniform(variable, value)
106
- raise RuntimeError, "No active shader!" unless Shader.active_shader
105
+ raise "No active shader!" unless Shader.active_shader
106
+
107
107
  Shader.active_shader.set_uniform(variable, value)
108
108
  end
109
109
 
110
110
  attr_reader :name, :program
111
- def initialize(name:, includes_dir: nil, vertex: "shaders/default.vert", fragment:)
111
+
112
+ def initialize(name:, fragment:, includes_dir: nil, vertex: "shaders/default.vert")
112
113
  raise "Shader name can not be blank" if name.length == 0
113
114
 
114
115
  @name = name
@@ -120,7 +121,7 @@ module CyberarmEngine
120
121
  @error_buffer_size = 1024 * 8
121
122
  @variable_missing = {}
122
123
 
123
- @data = {shaders: {}}
124
+ @data = { shaders: {} }
124
125
 
125
126
  unless shader_files_exist?(vertex: vertex, fragment: fragment)
126
127
  raise ArgumentError, "Shader files not found: #{vertex} or #{fragment}"
@@ -133,7 +134,7 @@ module CyberarmEngine
133
134
  compile_shader(type: :fragment)
134
135
  link_shaders
135
136
 
136
- @data[:shaders].each { |key, id| glDeleteShader(id) }
137
+ @data[:shaders].each { |_key, id| glDeleteShader(id) }
137
138
 
138
139
  # Only add shader if it successfully compiles
139
140
  if @compiled
@@ -175,7 +176,7 @@ module CyberarmEngine
175
176
  _size = [processed_source.length].pack("I")
176
177
  glShaderSource(_shader, 1, _source, _size)
177
178
 
178
- @data[:shaders][type] =_shader
179
+ @data[:shaders][type] = _shader
179
180
  end
180
181
 
181
182
  # evaluates shader preprocessors
@@ -199,22 +200,25 @@ module CyberarmEngine
199
200
  lines = source.lines
200
201
 
201
202
  lines.each_with_index do |line, i|
202
- if line.start_with?(PREPROCESSOR_CHARACTER)
203
- preprocessor = line.strip.split(" ")
204
- lines.delete(line)
203
+ next unless line.start_with?(PREPROCESSOR_CHARACTER)
205
204
 
206
- case preprocessor.first
207
- when "@include"
208
- raise ArgumentError, "Shader preprocessor include directory was not given for shader #{@name}" unless @includes_dir
205
+ preprocessor = line.strip.split(" ")
206
+ lines.delete(line)
209
207
 
210
- preprocessor[1..preprocessor.length - 1].join.scan(/"([^"]*)"/).flatten.each do |file|
211
- source = File.read("#{@includes_dir}/#{file}.glsl")
208
+ case preprocessor.first
209
+ when "@include"
210
+ unless @includes_dir
211
+ raise ArgumentError,
212
+ "Shader preprocessor include directory was not given for shader #{@name}"
213
+ end
214
+
215
+ preprocessor[1..preprocessor.length - 1].join.scan(/"([^"]*)"/).flatten.each do |file|
216
+ source = File.read("#{@includes_dir}/#{file}.glsl")
212
217
 
213
- lines.insert(i, source)
214
- end
215
- else
216
- warn "Unsupported preprocessor #{preprocessor.first} for #{@name}"
218
+ lines.insert(i, source)
217
219
  end
220
+ else
221
+ warn "Unsupported preprocessor #{preprocessor.first} for #{@name}"
218
222
  end
219
223
  end
220
224
 
@@ -230,12 +234,12 @@ module CyberarmEngine
230
234
  raise ArgumentError, "No shader for #{type.inspect}" unless _shader
231
235
 
232
236
  glCompileShader(_shader)
233
- buffer = ' '
237
+ buffer = " "
234
238
  glGetShaderiv(_shader, GL_COMPILE_STATUS, buffer)
235
- compiled = buffer.unpack('L')[0]
239
+ compiled = buffer.unpack1("L")
236
240
 
237
241
  if compiled == 0
238
- log = ' ' * @error_buffer_size
242
+ log = " " * @error_buffer_size
239
243
  glGetShaderInfoLog(_shader, @error_buffer_size, nil, log)
240
244
  puts "Shader Error: Program \"#{@name}\""
241
245
  puts " #{type.to_s.capitalize} Shader InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
@@ -246,7 +250,7 @@ module CyberarmEngine
246
250
  _compiled = true
247
251
  end
248
252
 
249
- return _compiled
253
+ _compiled
250
254
  end
251
255
 
252
256
  # link compiled OpenGL Shaders in to a OpenGL Program
@@ -261,18 +265,18 @@ module CyberarmEngine
261
265
  end
262
266
  glLinkProgram(@program)
263
267
 
264
- buffer = ' '
268
+ buffer = " "
265
269
  glGetProgramiv(@program, GL_LINK_STATUS, buffer)
266
- linked = buffer.unpack('L')[0]
270
+ linked = buffer.unpack1("L")
267
271
 
268
272
  if linked == 0
269
- log = ' ' * @error_buffer_size
273
+ log = " " * @error_buffer_size
270
274
  glGetProgramInfoLog(@program, @error_buffer_size, nil, log)
271
275
  puts "Shader Error: Program \"#{@name}\""
272
276
  puts " Program InfoLog:", " #{log.strip.split("\n").join("\n ")}\n\n"
273
277
  end
274
278
 
275
- @compiled = linked == 0 ? false : true
279
+ @compiled = !(linked == 0)
276
280
  end
277
281
 
278
282
  # Returns the location of a uniform _variable_
@@ -281,18 +285,22 @@ module CyberarmEngine
281
285
  # @return [Integer] location of uniform
282
286
  def variable(variable)
283
287
  loc = glGetUniformLocation(@program, variable)
284
- if (loc == -1)
285
- 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]
288
+ if loc == -1
289
+ unless @variable_missing[variable]
290
+ puts "Shader Error: Program \"#{@name}\" has no such uniform named \"#{variable}\"",
291
+ " Is it used in the shader? GLSL may have optimized it out.", " Is it miss spelled?"
292
+ end
286
293
  @variable_missing[variable] = true
287
294
  end
288
- return loc
295
+ loc
289
296
  end
290
297
 
291
298
  # @see Shader.use Shader.use
292
299
  def use(&block)
293
300
  return unless compiled?
294
301
  raise "Another shader is already in use! #{Shader.active_shader.name.inspect}" if Shader.active_shader
295
- Shader.active_shader=self
302
+
303
+ Shader.active_shader = self
296
304
 
297
305
  glUseProgram(@program)
298
306
 
@@ -331,7 +339,7 @@ module CyberarmEngine
331
339
  # @param location [Integer]
332
340
  # @return [void]
333
341
  def uniform_transform(variable, value, location = nil)
334
- attr_loc = location ? location : attribute_location(variable)
342
+ attr_loc = location || attribute_location(variable)
335
343
 
336
344
  glUniformMatrix4fv(attr_loc, 1, GL_FALSE, value.to_gl.pack("F16"))
337
345
  end
@@ -343,7 +351,7 @@ module CyberarmEngine
343
351
  # @param location [Integer]
344
352
  # @return [void]
345
353
  def uniform_boolean(variable, value, location = nil)
346
- attr_loc = location ? location : attribute_location(variable)
354
+ attr_loc = location || attribute_location(variable)
347
355
 
348
356
  glUniform1i(attr_loc, value ? 1 : 0)
349
357
  end
@@ -354,7 +362,7 @@ module CyberarmEngine
354
362
  # @param location [Integer]
355
363
  # @return [void]
356
364
  def uniform_integer(variable, value, location = nil)
357
- attr_loc = location ? location : attribute_location(variable)
365
+ attr_loc = location || attribute_location(variable)
358
366
 
359
367
  glUniform1i(attr_loc, value)
360
368
  end
@@ -366,7 +374,7 @@ module CyberarmEngine
366
374
  # @param location [Integer]
367
375
  # @return [void]
368
376
  def uniform_float(variable, value, location = nil)
369
- attr_loc = location ? location : attribute_location(variable)
377
+ attr_loc = location || attribute_location(variable)
370
378
 
371
379
  glUniform1f(attr_loc, value)
372
380
  end
@@ -378,7 +386,7 @@ module CyberarmEngine
378
386
  # @param location [Integer]
379
387
  # @return [void]
380
388
  def uniform_vec3(variable, value, location = nil)
381
- attr_loc = location ? location : attribute_location(variable)
389
+ attr_loc = location || attribute_location(variable)
382
390
 
383
391
  glUniform3f(attr_loc, *value.to_a[0..2])
384
392
  end
@@ -390,7 +398,7 @@ module CyberarmEngine
390
398
  # @param location [Integer]
391
399
  # @return [void]
392
400
  def uniform_vec4(variable, value, location = nil)
393
- attr_loc = location ? location : attribute_location(variable)
401
+ attr_loc = location || attribute_location(variable)
394
402
 
395
403
  glUniform4f(attr_loc, *value.to_a)
396
404
  end