cyberarm_engine 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/Rakefile +1 -1
  5. data/assets/textures/default.png +0 -0
  6. data/cyberarm_engine.gemspec +10 -8
  7. data/lib/cyberarm_engine.rb +13 -2
  8. data/lib/cyberarm_engine/animator.rb +6 -4
  9. data/lib/cyberarm_engine/background.rb +19 -15
  10. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  11. data/lib/cyberarm_engine/bounding_box.rb +18 -18
  12. data/lib/cyberarm_engine/cache.rb +4 -0
  13. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  14. data/lib/cyberarm_engine/common.rb +13 -13
  15. data/lib/cyberarm_engine/config_file.rb +2 -2
  16. data/lib/cyberarm_engine/game_object.rb +63 -72
  17. data/lib/cyberarm_engine/game_state.rb +6 -3
  18. data/lib/cyberarm_engine/model.rb +207 -0
  19. data/lib/cyberarm_engine/model/material.rb +21 -0
  20. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  21. data/lib/cyberarm_engine/model/parser.rb +74 -0
  22. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  23. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  24. data/lib/cyberarm_engine/model_cache.rb +31 -0
  25. data/lib/cyberarm_engine/opengl.rb +28 -0
  26. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  27. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  28. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  29. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  30. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  31. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  32. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  33. data/lib/cyberarm_engine/{shader.rb → opengl/shader.rb} +51 -43
  34. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  35. data/lib/cyberarm_engine/ray.rb +5 -5
  36. data/lib/cyberarm_engine/stats.rb +2 -2
  37. data/lib/cyberarm_engine/text.rb +41 -27
  38. data/lib/cyberarm_engine/timer.rb +1 -1
  39. data/lib/cyberarm_engine/transform.rb +43 -20
  40. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  41. data/lib/cyberarm_engine/ui/dsl.rb +25 -11
  42. data/lib/cyberarm_engine/ui/element.rb +30 -20
  43. data/lib/cyberarm_engine/ui/elements/button.rb +86 -16
  44. data/lib/cyberarm_engine/ui/elements/check_box.rb +1 -1
  45. data/lib/cyberarm_engine/ui/elements/container.rb +44 -20
  46. data/lib/cyberarm_engine/ui/elements/edit_box.rb +175 -2
  47. data/lib/cyberarm_engine/ui/elements/edit_line.rb +121 -37
  48. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -1
  49. data/lib/cyberarm_engine/ui/elements/image.rb +12 -9
  50. data/lib/cyberarm_engine/ui/elements/label.rb +93 -14
  51. data/lib/cyberarm_engine/ui/elements/list_box.rb +64 -2
  52. data/lib/cyberarm_engine/ui/elements/progress.rb +5 -5
  53. data/lib/cyberarm_engine/ui/elements/radio.rb +1 -1
  54. data/lib/cyberarm_engine/ui/elements/slider.rb +13 -16
  55. data/lib/cyberarm_engine/ui/elements/stack.rb +1 -1
  56. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +27 -19
  57. data/lib/cyberarm_engine/ui/event.rb +7 -7
  58. data/lib/cyberarm_engine/ui/gui_state.rb +44 -10
  59. data/lib/cyberarm_engine/ui/style.rb +10 -9
  60. data/lib/cyberarm_engine/ui/theme.rb +28 -20
  61. data/lib/cyberarm_engine/vector.rb +33 -30
  62. data/lib/cyberarm_engine/version.rb +2 -2
  63. data/lib/cyberarm_engine/window.rb +27 -18
  64. metadata +65 -15
@@ -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