cyberarm_engine 0.24.4 → 0.24.5

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 (93) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/Gemfile.lock +24 -0
  7. data/LICENSE.txt +21 -21
  8. data/README.md +74 -74
  9. data/Rakefile +10 -10
  10. data/assets/shaders/fragment/g_buffer.glsl +30 -30
  11. data/assets/shaders/fragment/lighting.glsl +115 -69
  12. data/assets/shaders/include/light_struct.glsl +11 -11
  13. data/assets/shaders/include/material_struct.glsl +16 -16
  14. data/assets/shaders/vertex/g_buffer.glsl +28 -28
  15. data/assets/shaders/vertex/lighting.glsl +24 -24
  16. data/bin/console +14 -14
  17. data/bin/setup +8 -8
  18. data/cyberarm_engine.gemspec +36 -36
  19. data/lib/cyberarm_engine/animator.rb +219 -219
  20. data/lib/cyberarm_engine/background.rb +180 -179
  21. data/lib/cyberarm_engine/background_image.rb +93 -93
  22. data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
  23. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  24. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  25. data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
  26. data/lib/cyberarm_engine/cache.rb +4 -4
  27. data/lib/cyberarm_engine/common.rb +128 -128
  28. data/lib/cyberarm_engine/config_file.rb +46 -46
  29. data/lib/cyberarm_engine/console/command.rb +157 -157
  30. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  31. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  32. data/lib/cyberarm_engine/console.rb +248 -248
  33. data/lib/cyberarm_engine/game_object.rb +244 -244
  34. data/lib/cyberarm_engine/game_state.rb +124 -124
  35. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +97 -97
  36. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
  37. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
  38. data/lib/cyberarm_engine/model/material.rb +21 -21
  39. data/lib/cyberarm_engine/model/{model_object.rb → mesh.rb} +131 -131
  40. data/lib/cyberarm_engine/model/parser.rb +74 -74
  41. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  42. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  43. data/lib/cyberarm_engine/model.rb +216 -213
  44. data/lib/cyberarm_engine/model_cache.rb +31 -31
  45. data/lib/cyberarm_engine/notification.rb +82 -82
  46. data/lib/cyberarm_engine/notification_manager.rb +241 -241
  47. data/lib/cyberarm_engine/opengl/light.rb +52 -50
  48. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  49. data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -38
  50. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  51. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -165
  52. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -304
  53. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
  54. data/lib/cyberarm_engine/opengl/shader.rb +408 -406
  55. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  56. data/lib/cyberarm_engine/opengl.rb +53 -40
  57. data/lib/cyberarm_engine/ray.rb +56 -56
  58. data/lib/cyberarm_engine/stats.rb +200 -200
  59. data/lib/cyberarm_engine/text.rb +260 -260
  60. data/lib/cyberarm_engine/timer.rb +23 -23
  61. data/lib/cyberarm_engine/transform.rb +296 -296
  62. data/lib/cyberarm_engine/trees/aabb_node.rb +126 -0
  63. data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -0
  64. data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -0
  65. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  66. data/lib/cyberarm_engine/ui/dsl.rb +142 -142
  67. data/lib/cyberarm_engine/ui/element.rb +662 -662
  68. data/lib/cyberarm_engine/ui/elements/button.rb +100 -100
  69. data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
  70. data/lib/cyberarm_engine/ui/elements/container.rb +404 -404
  71. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
  72. data/lib/cyberarm_engine/ui/elements/edit_line.rb +297 -297
  73. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  74. data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
  75. data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
  76. data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
  77. data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
  78. data/lib/cyberarm_engine/ui/elements/progress.rb +93 -93
  79. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  80. data/lib/cyberarm_engine/ui/elements/slider.rb +107 -107
  81. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  82. data/lib/cyberarm_engine/ui/elements/text_block.rb +216 -216
  83. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +67 -67
  84. data/lib/cyberarm_engine/ui/event.rb +54 -54
  85. data/lib/cyberarm_engine/ui/gui_state.rb +321 -321
  86. data/lib/cyberarm_engine/ui/style.rb +50 -50
  87. data/lib/cyberarm_engine/ui/theme.rb +225 -225
  88. data/lib/cyberarm_engine/vector.rb +312 -312
  89. data/lib/cyberarm_engine/version.rb +4 -4
  90. data/lib/cyberarm_engine/window.rb +195 -195
  91. data/lib/cyberarm_engine.rb +70 -78
  92. data/mrbgem.rake +29 -29
  93. metadata +8 -7
@@ -1,304 +1,307 @@
1
- module CyberarmEngine
2
- class OpenGLRenderer
3
- @@immediate_mode_warning = false
4
-
5
- attr_accessor :show_wireframe
6
- attr_reader :number_of_vertices
7
-
8
- def initialize(width:, height:, show_wireframe: false)
9
- @width = width
10
- @height = height
11
- @show_wireframe = show_wireframe
12
-
13
- @number_of_vertices = 0
14
-
15
- @g_buffer = GBuffer.new(width: @width, height: @height)
16
- end
17
-
18
- def canvas_size_changed
19
- @g_buffer.unbind_framebuffer
20
- @g_buffer.clean_up
21
-
22
- @g_buffer = GBuffer.new(width: @width, height: @height)
23
- end
24
-
25
- def render(camera, lights, entities)
26
- @number_of_vertices = 0
27
-
28
- glViewport(0, 0, @width, @height)
29
- glEnable(GL_DEPTH_TEST)
30
-
31
- if Shader.available?("g_buffer") && Shader.available?("lighting")
32
- @g_buffer.bind_for_writing
33
- gl_error?
34
-
35
- glClearColor(0.0, 0.0, 0.0, 0.0)
36
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
37
-
38
- Shader.use("g_buffer") do |shader|
39
- gl_error?
40
-
41
- entities.each do |entity|
42
- next unless entity.visible && entity.renderable
43
-
44
- shader.uniform_transform("projection", camera.projection_matrix)
45
- shader.uniform_transform("view", camera.view_matrix)
46
- shader.uniform_transform("model", entity.model_matrix)
47
- shader.uniform_vector3("camera_position", camera.position)
48
-
49
- gl_error?
50
- draw_model(entity.model, shader)
51
- entity.draw
52
-
53
- @number_of_vertices += entity.model.vertices_count
54
- end
55
- end
56
-
57
- @g_buffer.unbind_framebuffer
58
- gl_error?
59
-
60
- @g_buffer.bind_for_reading
61
- glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)
62
-
63
- lighting(lights)
64
- gl_error?
65
-
66
- post_processing
67
- gl_error?
68
-
69
- # render_framebuffer
70
- gl_error?
71
-
72
- @g_buffer.unbind_framebuffer
73
- gl_error?
74
- else
75
- unless @@immediate_mode_warning
76
- puts "Shaders are disabled or failed to compile, using immediate mode for rendering..."
77
- end
78
- @@immediate_mode_warning = true
79
-
80
- gl_error?
81
- lights.each(&:draw)
82
- camera.draw
83
-
84
- glEnable(GL_NORMALIZE)
85
- entities.each do |entity|
86
- next unless entity.visible && entity.renderable
87
-
88
- glPushMatrix
89
-
90
- glTranslatef(entity.position.x, entity.position.y, entity.position.z)
91
- glScalef(entity.scale.x, entity.scale.y, entity.scale.z)
92
- glRotatef(entity.orientation.x, 1.0, 0, 0)
93
- glRotatef(entity.orientation.y, 0, 1.0, 0)
94
- glRotatef(entity.orientation.z, 0, 0, 1.0)
95
-
96
- gl_error?
97
- draw_mesh(entity.model)
98
- entity.draw
99
- glPopMatrix
100
-
101
- @number_of_vertices += entity.model.vertices_count
102
- end
103
- end
104
-
105
- gl_error?
106
- end
107
-
108
- def copy_g_buffer_to_screen
109
- @g_buffer.set_read_buffer(:position)
110
- glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
111
- 0, 0, @g_buffer.width / 2, @g_buffer.height / 2,
112
- GL_COLOR_BUFFER_BIT, GL_LINEAR)
113
-
114
- @g_buffer.set_read_buffer(:diffuse)
115
- glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
116
- 0, @g_buffer.height / 2, @g_buffer.width / 2, @g_buffer.height,
117
- GL_COLOR_BUFFER_BIT, GL_LINEAR)
118
-
119
- @g_buffer.set_read_buffer(:normal)
120
- glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
121
- @g_buffer.width / 2, @g_buffer.height / 2, @g_buffer.width, @g_buffer.height,
122
- GL_COLOR_BUFFER_BIT, GL_LINEAR)
123
-
124
- @g_buffer.set_read_buffer(:texcoord)
125
- glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
126
- @g_buffer.width / 2, 0, @g_buffer.width, @g_buffer.height / 2,
127
- GL_COLOR_BUFFER_BIT, GL_LINEAR)
128
- end
129
-
130
- def lighting(lights)
131
- Shader.use("lighting") do |shader|
132
- glBindVertexArray(@g_buffer.screen_vbo)
133
-
134
- glDisable(GL_DEPTH_TEST)
135
- glEnable(GL_BLEND)
136
-
137
- glActiveTexture(GL_TEXTURE0)
138
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
139
- shader.uniform_integer("diffuse", 0)
140
-
141
- glActiveTexture(GL_TEXTURE1)
142
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:position))
143
- shader.uniform_integer("position", 1)
144
-
145
- glActiveTexture(GL_TEXTURE2)
146
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:texcoord))
147
- shader.uniform_integer("texcoord", 2)
148
-
149
- glActiveTexture(GL_TEXTURE3)
150
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:normal))
151
- shader.uniform_integer("normal", 3)
152
-
153
- glActiveTexture(GL_TEXTURE4)
154
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:depth))
155
- shader.uniform_integer("depth", 4)
156
-
157
- # FIXME: Try to figure out how to up this to 32 and/or beyond
158
- # (currently fails with more then 7 lights passed in to shader)
159
- lights.each_slice(7).each do |light_group|
160
- light_group.each_with_index do |light, _i|
161
- shader.uniform_integer("light_count", light_group.size)
162
-
163
- shader.uniform_integer("lights[#{_i}].type", light.type)
164
- shader.uniform_vector3("lights[#{_i}].direction", light.direction)
165
- shader.uniform_vector3("lights[#{_i}].position", light.position)
166
- shader.uniform_vector3("lights[#{_i}].diffuse", light.diffuse)
167
- shader.uniform_vector3("lights[#{_i}].ambient", light.ambient)
168
- shader.uniform_vector3("lights[#{_i}].specular", light.specular)
169
-
170
- glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
171
- end
172
- end
173
-
174
- glBindVertexArray(0)
175
- end
176
- end
177
-
178
- def post_processing
179
- end
180
-
181
- def render_framebuffer
182
- if Shader.available?("lighting")
183
- Shader.use("lighting") do |shader|
184
- glBindVertexArray(@g_buffer.screen_vbo)
185
-
186
- glDisable(GL_DEPTH_TEST)
187
- glEnable(GL_BLEND)
188
-
189
- glActiveTexture(GL_TEXTURE0)
190
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
191
- shader.uniform_integer("diffuse_texture", 0)
192
-
193
- glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
194
-
195
- glBindVertexArray(0)
196
- end
197
- end
198
- end
199
-
200
- def draw_model(model, shader)
201
- glBindVertexArray(model.vertex_array_id)
202
- glEnableVertexAttribArray(0)
203
- glEnableVertexAttribArray(1)
204
- glEnableVertexAttribArray(2)
205
- if model.has_texture?
206
- glEnableVertexAttribArray(3)
207
- glEnableVertexAttribArray(4)
208
- end
209
-
210
- if @show_wireframe
211
- glLineWidth(2)
212
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
213
- Shader.active_shader.uniform_boolean("disableLighting", true)
214
-
215
- glDrawArrays(GL_TRIANGLES, 0, model.faces.count * 3)
216
-
217
- Shader.active_shader.uniform_boolean("disableLighting", false)
218
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
219
- glLineWidth(1)
220
- end
221
-
222
- offset = 0
223
- model.objects.each do |object|
224
- shader.uniform_boolean("has_texture", object.has_texture?)
225
-
226
- if object.has_texture?
227
- glBindTexture(GL_TEXTURE_2D, object.materials.find { |mat| mat.texture_id }.texture_id)
228
- else
229
- glBindTexture(GL_TEXTURE_2D, 0)
230
- end
231
-
232
- glDrawArrays(GL_TRIANGLES, offset, object.faces.count * 3)
233
- offset += object.faces.count * 3
234
- end
235
-
236
- if model.has_texture?
237
- glDisableVertexAttribArray(4)
238
- glDisableVertexAttribArray(3)
239
-
240
- glBindTexture(GL_TEXTURE_2D, 0)
241
- end
242
- glDisableVertexAttribArray(2)
243
- glDisableVertexAttribArray(1)
244
- glDisableVertexAttribArray(0)
245
-
246
- glBindBuffer(GL_ARRAY_BUFFER, 0)
247
- glBindVertexArray(0)
248
- end
249
-
250
- def draw_mesh(model)
251
- model.objects.each_with_index do |o, _i|
252
- glEnable(GL_COLOR_MATERIAL)
253
- glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
254
- glShadeModel(GL_FLAT) unless o.faces.first[4]
255
- glShadeModel(GL_SMOOTH) if o.faces.first[4]
256
- glEnableClientState(GL_VERTEX_ARRAY)
257
- glEnableClientState(GL_COLOR_ARRAY)
258
- glEnableClientState(GL_NORMAL_ARRAY)
259
-
260
- if o.has_texture?
261
- glEnable(GL_TEXTURE_2D)
262
- glBindTexture(GL_TEXTURE_2D, o.materials.find { |mat| mat.texture_id }.texture_id)
263
- glEnableClientState(GL_TEXTURE_COORD_ARRAY)
264
- glTexCoordPointer(3, GL_FLOAT, 0, o.flattened_uvs)
265
- end
266
-
267
- glVertexPointer(4, GL_FLOAT, 0, o.flattened_vertices)
268
- glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
269
- glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
270
-
271
- if @show_wireframe # This is kinda expensive
272
- glDisable(GL_LIGHTING)
273
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
274
- glPolygonOffset(2, 0.5)
275
- glLineWidth(3)
276
-
277
- glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
278
-
279
- glLineWidth(1)
280
- glPolygonOffset(0, 0)
281
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
282
- glEnable(GL_LIGHTING)
283
-
284
- glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
285
- else
286
- glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
287
- end
288
-
289
- # glBindBuffer(GL_ARRAY_BUFFER, 0)
290
-
291
- glDisableClientState(GL_VERTEX_ARRAY)
292
- glDisableClientState(GL_COLOR_ARRAY)
293
- glDisableClientState(GL_NORMAL_ARRAY)
294
-
295
- if o.has_texture?
296
- glDisableClientState(GL_TEXTURE_COORD_ARRAY)
297
- glDisable(GL_TEXTURE_2D)
298
- end
299
-
300
- glDisable(GL_COLOR_MATERIAL)
301
- end
302
- end
303
- end
304
- end
1
+ module CyberarmEngine
2
+ class OpenGLRenderer
3
+ include OpenGL
4
+ include CyberarmEngine
5
+
6
+ @@immediate_mode_warning = false
7
+
8
+ attr_accessor :show_wireframe
9
+ attr_reader :number_of_vertices
10
+
11
+ def initialize(width:, height:, show_wireframe: false)
12
+ @width = width
13
+ @height = height
14
+ @show_wireframe = show_wireframe
15
+
16
+ @number_of_vertices = 0
17
+
18
+ @g_buffer = GBuffer.new(width: @width, height: @height)
19
+ end
20
+
21
+ def canvas_size_changed
22
+ @g_buffer.unbind_framebuffer
23
+ @g_buffer.clean_up
24
+
25
+ @g_buffer = GBuffer.new(width: @width, height: @height)
26
+ end
27
+
28
+ def render(camera, lights, entities)
29
+ @number_of_vertices = 0
30
+
31
+ glViewport(0, 0, @width, @height)
32
+ glEnable(GL_DEPTH_TEST)
33
+
34
+ if Shader.available?("g_buffer") && Shader.available?("lighting")
35
+ @g_buffer.bind_for_writing
36
+ gl_error?
37
+
38
+ glClearColor(0.0, 0.0, 0.0, 0.0)
39
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
40
+
41
+ Shader.use("g_buffer") do |shader|
42
+ gl_error?
43
+
44
+ entities.each do |entity|
45
+ next unless entity.visible && entity.renderable
46
+
47
+ shader.uniform_transform("projection", camera.projection_matrix)
48
+ shader.uniform_transform("view", camera.view_matrix)
49
+ shader.uniform_transform("model", entity.model_matrix)
50
+ shader.uniform_vector3("camera_position", camera.position)
51
+
52
+ gl_error?
53
+ draw_model(entity.model, shader)
54
+ entity.draw
55
+
56
+ @number_of_vertices += entity.model.vertices_count
57
+ end
58
+ end
59
+
60
+ @g_buffer.unbind_framebuffer
61
+ gl_error?
62
+
63
+ @g_buffer.bind_for_reading
64
+ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0)
65
+
66
+ lighting(lights)
67
+ gl_error?
68
+
69
+ post_processing
70
+ gl_error?
71
+
72
+ # render_framebuffer
73
+ gl_error?
74
+
75
+ @g_buffer.unbind_framebuffer
76
+ gl_error?
77
+ else
78
+ unless @@immediate_mode_warning
79
+ puts "Shaders are disabled or failed to compile, using immediate mode for rendering..."
80
+ end
81
+ @@immediate_mode_warning = true
82
+
83
+ gl_error?
84
+ lights.each(&:draw)
85
+ camera.draw
86
+
87
+ glEnable(GL_NORMALIZE)
88
+ entities.each do |entity|
89
+ next unless entity.visible && entity.renderable
90
+
91
+ glPushMatrix
92
+
93
+ glTranslatef(entity.position.x, entity.position.y, entity.position.z)
94
+ glScalef(entity.scale.x, entity.scale.y, entity.scale.z)
95
+ glRotatef(entity.orientation.x, 1.0, 0, 0)
96
+ glRotatef(entity.orientation.y, 0, 1.0, 0)
97
+ glRotatef(entity.orientation.z, 0, 0, 1.0)
98
+
99
+ gl_error?
100
+ draw_mesh(entity.model)
101
+ entity.draw
102
+ glPopMatrix
103
+
104
+ @number_of_vertices += entity.model.vertices_count
105
+ end
106
+ end
107
+
108
+ gl_error?
109
+ end
110
+
111
+ def copy_g_buffer_to_screen
112
+ @g_buffer.set_read_buffer(:position)
113
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
114
+ 0, 0, @g_buffer.width / 2, @g_buffer.height / 2,
115
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
116
+
117
+ @g_buffer.set_read_buffer(:diffuse)
118
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
119
+ 0, @g_buffer.height / 2, @g_buffer.width / 2, @g_buffer.height,
120
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
121
+
122
+ @g_buffer.set_read_buffer(:normal)
123
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
124
+ @g_buffer.width / 2, @g_buffer.height / 2, @g_buffer.width, @g_buffer.height,
125
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
126
+
127
+ @g_buffer.set_read_buffer(:texcoord)
128
+ glBlitFramebuffer(0, 0, @g_buffer.width, @g_buffer.height,
129
+ @g_buffer.width / 2, 0, @g_buffer.width, @g_buffer.height / 2,
130
+ GL_COLOR_BUFFER_BIT, GL_LINEAR)
131
+ end
132
+
133
+ def lighting(lights)
134
+ Shader.use("lighting") do |shader|
135
+ glBindVertexArray(@g_buffer.screen_vbo)
136
+
137
+ glDisable(GL_DEPTH_TEST)
138
+ glEnable(GL_BLEND)
139
+
140
+ glActiveTexture(GL_TEXTURE0)
141
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
142
+ shader.uniform_integer("diffuse", 0)
143
+
144
+ glActiveTexture(GL_TEXTURE1)
145
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:position))
146
+ shader.uniform_integer("position", 1)
147
+
148
+ glActiveTexture(GL_TEXTURE2)
149
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:texcoord))
150
+ shader.uniform_integer("texcoord", 2)
151
+
152
+ glActiveTexture(GL_TEXTURE3)
153
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:normal))
154
+ shader.uniform_integer("normal", 3)
155
+
156
+ glActiveTexture(GL_TEXTURE4)
157
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:depth))
158
+ shader.uniform_integer("depth", 4)
159
+
160
+ # FIXME: Try to figure out how to up this to 32 and/or beyond
161
+ # (currently fails with more then 7 lights passed in to shader)
162
+ lights.each_slice(7).each do |light_group|
163
+ light_group.each_with_index do |light, _i|
164
+ shader.uniform_integer("light_count", light_group.size)
165
+
166
+ shader.uniform_integer("lights[#{_i}].type", light.type)
167
+ shader.uniform_vector3("lights[#{_i}].direction", light.direction)
168
+ shader.uniform_vector3("lights[#{_i}].position", light.position)
169
+ shader.uniform_vector3("lights[#{_i}].diffuse", light.diffuse)
170
+ shader.uniform_vector3("lights[#{_i}].ambient", light.ambient)
171
+ shader.uniform_vector3("lights[#{_i}].specular", light.specular)
172
+
173
+ glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
174
+ end
175
+ end
176
+
177
+ glBindVertexArray(0)
178
+ end
179
+ end
180
+
181
+ def post_processing
182
+ end
183
+
184
+ def render_framebuffer
185
+ if Shader.available?("lighting")
186
+ Shader.use("lighting") do |shader|
187
+ glBindVertexArray(@g_buffer.screen_vbo)
188
+
189
+ glDisable(GL_DEPTH_TEST)
190
+ glEnable(GL_BLEND)
191
+
192
+ glActiveTexture(GL_TEXTURE0)
193
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
194
+ shader.uniform_integer("diffuse_texture", 0)
195
+
196
+ glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
197
+
198
+ glBindVertexArray(0)
199
+ end
200
+ end
201
+ end
202
+
203
+ def draw_model(model, shader)
204
+ glBindVertexArray(model.vertex_array_id)
205
+ glEnableVertexAttribArray(0)
206
+ glEnableVertexAttribArray(1)
207
+ glEnableVertexAttribArray(2)
208
+ if model.has_texture?
209
+ glEnableVertexAttribArray(3)
210
+ glEnableVertexAttribArray(4)
211
+ end
212
+
213
+ if @show_wireframe
214
+ glLineWidth(2)
215
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
216
+ Shader.active_shader.uniform_boolean("disableLighting", true)
217
+
218
+ glDrawArrays(GL_TRIANGLES, 0, model.faces.count * 3)
219
+
220
+ Shader.active_shader.uniform_boolean("disableLighting", false)
221
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
222
+ glLineWidth(1)
223
+ end
224
+
225
+ offset = 0
226
+ model.objects.each do |object|
227
+ shader.uniform_boolean("has_texture", object.has_texture?)
228
+
229
+ if object.has_texture?
230
+ glBindTexture(GL_TEXTURE_2D, object.materials.find { |mat| mat.texture_id }.texture_id)
231
+ else
232
+ glBindTexture(GL_TEXTURE_2D, 0)
233
+ end
234
+
235
+ glDrawArrays(GL_TRIANGLES, offset, object.faces.count * 3)
236
+ offset += object.faces.count * 3
237
+ end
238
+
239
+ if model.has_texture?
240
+ glDisableVertexAttribArray(4)
241
+ glDisableVertexAttribArray(3)
242
+
243
+ glBindTexture(GL_TEXTURE_2D, 0)
244
+ end
245
+ glDisableVertexAttribArray(2)
246
+ glDisableVertexAttribArray(1)
247
+ glDisableVertexAttribArray(0)
248
+
249
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
250
+ glBindVertexArray(0)
251
+ end
252
+
253
+ def draw_mesh(model)
254
+ model.objects.each_with_index do |o, _i|
255
+ glEnable(GL_COLOR_MATERIAL)
256
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
257
+ glShadeModel(GL_FLAT) unless o.faces.first[4]
258
+ glShadeModel(GL_SMOOTH) if o.faces.first[4]
259
+ glEnableClientState(GL_VERTEX_ARRAY)
260
+ glEnableClientState(GL_COLOR_ARRAY)
261
+ glEnableClientState(GL_NORMAL_ARRAY)
262
+
263
+ if o.has_texture?
264
+ glEnable(GL_TEXTURE_2D)
265
+ glBindTexture(GL_TEXTURE_2D, o.materials.find { |mat| mat.texture_id }.texture_id)
266
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY)
267
+ glTexCoordPointer(3, GL_FLOAT, 0, o.flattened_uvs)
268
+ end
269
+
270
+ glVertexPointer(4, GL_FLOAT, 0, o.flattened_vertices)
271
+ glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
272
+ glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
273
+
274
+ if @show_wireframe # This is kinda expensive
275
+ glDisable(GL_LIGHTING)
276
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
277
+ glPolygonOffset(2, 0.5)
278
+ glLineWidth(3)
279
+
280
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
281
+
282
+ glLineWidth(1)
283
+ glPolygonOffset(0, 0)
284
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
285
+ glEnable(GL_LIGHTING)
286
+
287
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
288
+ else
289
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
290
+ end
291
+
292
+ # glBindBuffer(GL_ARRAY_BUFFER, 0)
293
+
294
+ glDisableClientState(GL_VERTEX_ARRAY)
295
+ glDisableClientState(GL_COLOR_ARRAY)
296
+ glDisableClientState(GL_NORMAL_ARRAY)
297
+
298
+ if o.has_texture?
299
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY)
300
+ glDisable(GL_TEXTURE_2D)
301
+ end
302
+
303
+ glDisable(GL_COLOR_MATERIAL)
304
+ end
305
+ end
306
+ end
307
+ end