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.
- checksums.yaml +4 -4
- data/.rubocop.yml +8 -0
- data/Gemfile +1 -1
- data/README.md +1 -1
- data/Rakefile +1 -1
- data/assets/textures/default.png +0 -0
- data/cyberarm_engine.gemspec +12 -9
- data/lib/cyberarm_engine.rb +20 -5
- data/lib/cyberarm_engine/animator.rb +6 -4
- data/lib/cyberarm_engine/background.rb +19 -15
- data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
- data/lib/cyberarm_engine/bounding_box.rb +18 -18
- data/lib/cyberarm_engine/cache.rb +4 -0
- data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
- data/lib/cyberarm_engine/common.rb +16 -16
- data/lib/cyberarm_engine/config_file.rb +2 -2
- data/lib/cyberarm_engine/game_object.rb +63 -72
- data/lib/cyberarm_engine/game_state.rb +6 -3
- data/lib/cyberarm_engine/model.rb +207 -0
- data/lib/cyberarm_engine/model/material.rb +21 -0
- data/lib/cyberarm_engine/model/model_object.rb +131 -0
- data/lib/cyberarm_engine/model/parser.rb +74 -0
- data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
- data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
- data/lib/cyberarm_engine/model_cache.rb +31 -0
- data/lib/cyberarm_engine/opengl.rb +28 -0
- data/lib/cyberarm_engine/opengl/light.rb +50 -0
- data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
- data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
- data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
- data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
- data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
- data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
- data/lib/cyberarm_engine/{shader.rb → opengl/shader.rb} +51 -43
- data/lib/cyberarm_engine/opengl/texture.rb +69 -0
- data/lib/cyberarm_engine/ray.rb +5 -5
- data/lib/cyberarm_engine/stats.rb +21 -0
- data/lib/cyberarm_engine/text.rb +45 -31
- data/lib/cyberarm_engine/timer.rb +1 -1
- data/lib/cyberarm_engine/transform.rb +43 -20
- data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
- data/lib/cyberarm_engine/ui/dsl.rb +49 -10
- data/lib/cyberarm_engine/ui/element.rb +73 -21
- data/lib/cyberarm_engine/ui/elements/button.rb +121 -28
- data/lib/cyberarm_engine/ui/elements/check_box.rb +25 -33
- data/lib/cyberarm_engine/ui/elements/container.rb +113 -33
- data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
- data/lib/cyberarm_engine/ui/elements/edit_line.rb +145 -45
- data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
- data/lib/cyberarm_engine/ui/elements/image.rb +32 -12
- data/lib/cyberarm_engine/ui/elements/label.rb +122 -16
- data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -0
- data/lib/cyberarm_engine/ui/elements/progress.rb +6 -5
- data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
- data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
- data/lib/cyberarm_engine/ui/elements/stack.rb +1 -3
- data/lib/cyberarm_engine/ui/elements/text_block.rb +156 -0
- data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
- data/lib/cyberarm_engine/ui/event.rb +7 -7
- data/lib/cyberarm_engine/ui/gui_state.rb +118 -6
- data/lib/cyberarm_engine/ui/style.rb +10 -9
- data/lib/cyberarm_engine/ui/theme.rb +84 -22
- data/lib/cyberarm_engine/vector.rb +33 -30
- data/lib/cyberarm_engine/version.rb +2 -2
- data/lib/cyberarm_engine/{engine.rb → window.rb} +32 -19
- metadata +87 -18
- 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
|
-
|
72
|
-
|
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
|
-
|
79
|
-
|
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
|
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
|
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
|
-
|
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 { |
|
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
|
-
|
203
|
-
preprocessor = line.strip.split(" ")
|
204
|
-
lines.delete(line)
|
203
|
+
next unless line.start_with?(PREPROCESSOR_CHARACTER)
|
205
204
|
|
206
|
-
|
207
|
-
|
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
|
-
|
211
|
-
|
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
|
-
|
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.
|
239
|
+
compiled = buffer.unpack1("L")
|
236
240
|
|
237
241
|
if compiled == 0
|
238
|
-
log =
|
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
|
-
|
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.
|
270
|
+
linked = buffer.unpack1("L")
|
267
271
|
|
268
272
|
if linked == 0
|
269
|
-
log =
|
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
|
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
|
285
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
401
|
+
attr_loc = location || attribute_location(variable)
|
394
402
|
|
395
403
|
glUniform4f(attr_loc, *value.to_a)
|
396
404
|
end
|