cyberarm_engine 0.25.0 → 0.30.0

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +9 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/Gemfile.lock +37 -25
  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 -115
  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/assets/textures/ui/circle.png +0 -0
  17. data/assets/textures/ui/circle_small.png +0 -0
  18. data/assets/textures/ui/rounded.png +0 -0
  19. data/assets/textures/ui/rounded_bottom.png +0 -0
  20. data/assets/textures/ui/rounded_left.png +0 -0
  21. data/assets/textures/ui/rounded_left_bottom.png +0 -0
  22. data/assets/textures/ui/rounded_left_top.png +0 -0
  23. data/assets/textures/ui/rounded_right.png +0 -0
  24. data/assets/textures/ui/rounded_right_bottom.png +0 -0
  25. data/assets/textures/ui/rounded_right_top.png +0 -0
  26. data/assets/textures/ui/rounded_small.png +0 -0
  27. data/assets/textures/ui/rounded_tiny.png +0 -0
  28. data/assets/textures/ui/rounded_top.png +0 -0
  29. data/assets/textures/ui/square.png +0 -0
  30. data/bin/console +14 -14
  31. data/bin/setup +8 -8
  32. data/cyberarm_engine.gemspec +35 -36
  33. data/lib/cyberarm_engine/animator.rb +219 -219
  34. data/lib/cyberarm_engine/background.rb +156 -158
  35. data/lib/cyberarm_engine/background_image.rb +93 -93
  36. data/lib/cyberarm_engine/background_nine_slice.rb +182 -142
  37. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  38. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  39. data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
  40. data/lib/cyberarm_engine/cache.rb +4 -4
  41. data/lib/cyberarm_engine/common.rb +133 -131
  42. data/lib/cyberarm_engine/config_file.rb +46 -46
  43. data/lib/cyberarm_engine/console/command.rb +157 -157
  44. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  45. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  46. data/lib/cyberarm_engine/console.rb +248 -248
  47. data/lib/cyberarm_engine/event_bus.rb +39 -0
  48. data/lib/cyberarm_engine/game_object.rb +244 -244
  49. data/lib/cyberarm_engine/game_state.rb +134 -124
  50. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +111 -111
  51. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
  52. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
  53. data/lib/cyberarm_engine/model/material.rb +21 -21
  54. data/lib/cyberarm_engine/model/mesh.rb +131 -131
  55. data/lib/cyberarm_engine/model/parser.rb +74 -74
  56. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  57. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  58. data/lib/cyberarm_engine/model.rb +216 -216
  59. data/lib/cyberarm_engine/model_cache.rb +31 -31
  60. data/lib/cyberarm_engine/notification.rb +82 -82
  61. data/lib/cyberarm_engine/notification_manager.rb +241 -241
  62. data/lib/cyberarm_engine/opengl/light.rb +52 -52
  63. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  64. data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -41
  65. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  66. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -167
  67. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -307
  68. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
  69. data/lib/cyberarm_engine/opengl/shader.rb +408 -408
  70. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  71. data/lib/cyberarm_engine/opengl.rb +53 -53
  72. data/lib/cyberarm_engine/pathfinding/graph.rb +64 -0
  73. data/lib/cyberarm_engine/pathfinding/graph_search.rb +6 -0
  74. data/lib/cyberarm_engine/pathfinding/graph_searches/astar_search.rb +6 -0
  75. data/lib/cyberarm_engine/pathfinding/graph_searches/breadth_first_search.rb +27 -0
  76. data/lib/cyberarm_engine/pathfinding/graph_searches/dijkstra_search.rb +6 -0
  77. data/lib/cyberarm_engine/pathfinding/graphs/grid.rb +52 -0
  78. data/lib/cyberarm_engine/ray.rb +56 -56
  79. data/lib/cyberarm_engine/result.rb +19 -0
  80. data/lib/cyberarm_engine/stats.rb +200 -200
  81. data/lib/cyberarm_engine/text.rb +288 -260
  82. data/lib/cyberarm_engine/timer.rb +27 -23
  83. data/lib/cyberarm_engine/transform.rb +296 -296
  84. data/lib/cyberarm_engine/trees/aabb_node.rb +126 -126
  85. data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -55
  86. data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -29
  87. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  88. data/lib/cyberarm_engine/ui/dialog.rb +24 -0
  89. data/lib/cyberarm_engine/ui/dsl.rb +170 -142
  90. data/lib/cyberarm_engine/ui/element.rb +664 -662
  91. data/lib/cyberarm_engine/ui/elements/button.rb +99 -100
  92. data/lib/cyberarm_engine/ui/elements/check_box.rb +58 -54
  93. data/lib/cyberarm_engine/ui/elements/container.rb +413 -407
  94. data/lib/cyberarm_engine/ui/elements/edit_box.rb +200 -179
  95. data/lib/cyberarm_engine/ui/elements/edit_line.rb +299 -297
  96. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  97. data/lib/cyberarm_engine/ui/elements/image.rb +78 -72
  98. data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
  99. data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
  100. data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
  101. data/lib/cyberarm_engine/ui/elements/progress.rb +95 -93
  102. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  103. data/lib/cyberarm_engine/ui/elements/slider.rb +111 -107
  104. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  105. data/lib/cyberarm_engine/ui/elements/text_block.rb +236 -222
  106. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +71 -67
  107. data/lib/cyberarm_engine/ui/elements/widget.rb +45 -0
  108. data/lib/cyberarm_engine/ui/event.rb +54 -54
  109. data/lib/cyberarm_engine/ui/gui_state.rb +402 -326
  110. data/lib/cyberarm_engine/ui/page.rb +39 -0
  111. data/lib/cyberarm_engine/ui/style.rb +94 -61
  112. data/lib/cyberarm_engine/ui/theme.rb +237 -225
  113. data/lib/cyberarm_engine/vector.rb +312 -312
  114. data/lib/cyberarm_engine/version.rb +4 -4
  115. data/lib/cyberarm_engine/window.rb +234 -195
  116. data/lib/cyberarm_engine.rb +88 -76
  117. data/mrbgem.rake +29 -29
  118. metadata +30 -5
@@ -1,307 +1,307 @@
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
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
@@ -1,33 +1,33 @@
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: CyberarmEngine::Window.instance.width, height: CyberarmEngine::Window.instance.height)
8
- end
9
-
10
- def draw(camera, lights, entities)
11
- Stats.frame.start_timing(:opengl_renderer)
12
-
13
- Stats.frame.start_timing(:opengl_model_renderer)
14
- @opengl_renderer.render(camera, lights, entities)
15
- Stats.frame.end_timing(:opengl_model_renderer)
16
-
17
- if @show_bounding_boxes
18
- Stats.frame.start_timing(:opengl_boundingbox_renderer)
19
- @bounding_box_renderer.render(entities)
20
- Stats.frame.end_timing(:opengl_boundingbox_renderer)
21
- end
22
-
23
- Stats.frame.end_timing(:opengl_renderer)
24
- end
25
-
26
- def canvas_size_changed
27
- @opengl_renderer.canvas_size_changed
28
- end
29
-
30
- def finalize # cleanup
31
- end
32
- end
33
- end
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: CyberarmEngine::Window.instance.width, height: CyberarmEngine::Window.instance.height)
8
+ end
9
+
10
+ def draw(camera, lights, entities)
11
+ Stats.frame.start_timing(:opengl_renderer)
12
+
13
+ Stats.frame.start_timing(:opengl_model_renderer)
14
+ @opengl_renderer.render(camera, lights, entities)
15
+ Stats.frame.end_timing(:opengl_model_renderer)
16
+
17
+ if @show_bounding_boxes
18
+ Stats.frame.start_timing(:opengl_boundingbox_renderer)
19
+ @bounding_box_renderer.render(entities)
20
+ Stats.frame.end_timing(:opengl_boundingbox_renderer)
21
+ end
22
+
23
+ Stats.frame.end_timing(:opengl_renderer)
24
+ end
25
+
26
+ def canvas_size_changed
27
+ @opengl_renderer.canvas_size_changed
28
+ end
29
+
30
+ def finalize # cleanup
31
+ end
32
+ end
33
+ end