cyberarm_engine 0.19.0 → 0.19.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) 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/LICENSE.txt +21 -21
  7. data/README.md +74 -74
  8. data/Rakefile +10 -10
  9. data/bin/console +14 -14
  10. data/bin/setup +8 -8
  11. data/cyberarm_engine.gemspec +39 -39
  12. data/lib/cyberarm_engine/animator.rb +219 -219
  13. data/lib/cyberarm_engine/background.rb +179 -179
  14. data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
  15. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  16. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  17. data/lib/cyberarm_engine/cache/download_manager.rb +121 -121
  18. data/lib/cyberarm_engine/cache.rb +4 -4
  19. data/lib/cyberarm_engine/common.rb +113 -113
  20. data/lib/cyberarm_engine/config_file.rb +46 -46
  21. data/lib/cyberarm_engine/console/command.rb +157 -157
  22. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  23. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  24. data/lib/cyberarm_engine/console.rb +248 -248
  25. data/lib/cyberarm_engine/game_object.rb +248 -248
  26. data/lib/cyberarm_engine/game_state.rb +97 -97
  27. data/lib/cyberarm_engine/model/material.rb +21 -21
  28. data/lib/cyberarm_engine/model/model_object.rb +131 -131
  29. data/lib/cyberarm_engine/model/parser.rb +74 -74
  30. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  31. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  32. data/lib/cyberarm_engine/model.rb +212 -212
  33. data/lib/cyberarm_engine/model_cache.rb +31 -31
  34. data/lib/cyberarm_engine/opengl/light.rb +50 -50
  35. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  36. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -38
  37. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  38. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -164
  39. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +298 -298
  40. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -22
  41. data/lib/cyberarm_engine/opengl/shader.rb +406 -406
  42. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  43. data/lib/cyberarm_engine/opengl.rb +28 -28
  44. data/lib/cyberarm_engine/ray.rb +56 -56
  45. data/lib/cyberarm_engine/stats.rb +21 -21
  46. data/lib/cyberarm_engine/text.rb +197 -197
  47. data/lib/cyberarm_engine/timer.rb +23 -23
  48. data/lib/cyberarm_engine/transform.rb +296 -296
  49. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  50. data/lib/cyberarm_engine/ui/dsl.rb +139 -139
  51. data/lib/cyberarm_engine/ui/element.rb +488 -488
  52. data/lib/cyberarm_engine/ui/elements/button.rb +97 -97
  53. data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
  54. data/lib/cyberarm_engine/ui/elements/container.rb +256 -256
  55. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
  56. data/lib/cyberarm_engine/ui/elements/edit_line.rb +263 -263
  57. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  58. data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
  59. data/lib/cyberarm_engine/ui/elements/list_box.rb +88 -82
  60. data/lib/cyberarm_engine/ui/elements/progress.rb +51 -51
  61. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  62. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -104
  63. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  64. data/lib/cyberarm_engine/ui/elements/text_block.rb +162 -162
  65. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +65 -65
  66. data/lib/cyberarm_engine/ui/event.rb +54 -54
  67. data/lib/cyberarm_engine/ui/gui_state.rb +256 -256
  68. data/lib/cyberarm_engine/ui/style.rb +49 -49
  69. data/lib/cyberarm_engine/ui/theme.rb +207 -207
  70. data/lib/cyberarm_engine/vector.rb +293 -293
  71. data/lib/cyberarm_engine/version.rb +4 -4
  72. data/lib/cyberarm_engine/window.rb +120 -120
  73. data/lib/cyberarm_engine.rb +71 -71
  74. metadata +3 -3
@@ -1,298 +1,298 @@
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_vec3("cameraPosition", 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
- lights.each_with_index do |light, _i|
158
- shader.uniform_integer("light[0].type", light.type)
159
- shader.uniform_vec3("light[0].direction", light.direction)
160
- shader.uniform_vec3("light[0].position", light.position)
161
- shader.uniform_vec3("light[0].diffuse", light.diffuse)
162
- shader.uniform_vec3("light[0].ambient", light.ambient)
163
- shader.uniform_vec3("light[0].specular", light.specular)
164
-
165
- glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
166
- end
167
-
168
- glBindVertexArray(0)
169
- end
170
- end
171
-
172
- def post_processing
173
- end
174
-
175
- def render_framebuffer
176
- if Shader.available?("lighting")
177
- Shader.use("lighting") do |shader|
178
- glBindVertexArray(@g_buffer.screen_vbo)
179
-
180
- glDisable(GL_DEPTH_TEST)
181
- glEnable(GL_BLEND)
182
-
183
- glActiveTexture(GL_TEXTURE0)
184
- glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
185
- shader.uniform_integer("diffuse_texture", 0)
186
-
187
- glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
188
-
189
- glBindVertexArray(0)
190
- end
191
- end
192
- end
193
-
194
- def draw_model(model, shader)
195
- glBindVertexArray(model.vertex_array_id)
196
- glEnableVertexAttribArray(0)
197
- glEnableVertexAttribArray(1)
198
- glEnableVertexAttribArray(2)
199
- if model.has_texture?
200
- glEnableVertexAttribArray(3)
201
- glEnableVertexAttribArray(4)
202
- end
203
-
204
- if @show_wireframe
205
- glLineWidth(2)
206
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
207
- Shader.active_shader.uniform_boolean("disableLighting", true)
208
-
209
- glDrawArrays(GL_TRIANGLES, 0, model.faces.count * 3)
210
-
211
- Shader.active_shader.uniform_boolean("disableLighting", false)
212
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
213
- glLineWidth(1)
214
- end
215
-
216
- offset = 0
217
- model.objects.each do |object|
218
- shader.uniform_boolean("hasTexture", object.has_texture?)
219
-
220
- if object.has_texture?
221
- glBindTexture(GL_TEXTURE_2D, object.materials.find { |mat| mat.texture_id }.texture_id)
222
- else
223
- glBindTexture(GL_TEXTURE_2D, 0)
224
- end
225
-
226
- glDrawArrays(GL_TRIANGLES, offset, object.faces.count * 3)
227
- offset += object.faces.count * 3
228
- end
229
-
230
- if model.has_texture?
231
- glDisableVertexAttribArray(4)
232
- glDisableVertexAttribArray(3)
233
-
234
- glBindTexture(GL_TEXTURE_2D, 0)
235
- end
236
- glDisableVertexAttribArray(2)
237
- glDisableVertexAttribArray(1)
238
- glDisableVertexAttribArray(0)
239
-
240
- glBindBuffer(GL_ARRAY_BUFFER, 0)
241
- glBindVertexArray(0)
242
- end
243
-
244
- def draw_mesh(model)
245
- model.objects.each_with_index do |o, _i|
246
- glEnable(GL_COLOR_MATERIAL)
247
- glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
248
- glShadeModel(GL_FLAT) unless o.faces.first[4]
249
- glShadeModel(GL_SMOOTH) if o.faces.first[4]
250
- glEnableClientState(GL_VERTEX_ARRAY)
251
- glEnableClientState(GL_COLOR_ARRAY)
252
- glEnableClientState(GL_NORMAL_ARRAY)
253
-
254
- if o.has_texture?
255
- glEnable(GL_TEXTURE_2D)
256
- glBindTexture(GL_TEXTURE_2D, o.materials.find { |mat| mat.texture_id }.texture_id)
257
- glEnableClientState(GL_TEXTURE_COORD_ARRAY)
258
- glTexCoordPointer(3, GL_FLOAT, 0, o.flattened_uvs)
259
- end
260
-
261
- glVertexPointer(4, GL_FLOAT, 0, o.flattened_vertices)
262
- glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
263
- glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
264
-
265
- if @show_wireframe # This is kinda expensive
266
- glDisable(GL_LIGHTING)
267
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
268
- glPolygonOffset(2, 0.5)
269
- glLineWidth(3)
270
-
271
- glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
272
-
273
- glLineWidth(1)
274
- glPolygonOffset(0, 0)
275
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
276
- glEnable(GL_LIGHTING)
277
-
278
- glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
279
- else
280
- glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
281
- end
282
-
283
- # glBindBuffer(GL_ARRAY_BUFFER, 0)
284
-
285
- glDisableClientState(GL_VERTEX_ARRAY)
286
- glDisableClientState(GL_COLOR_ARRAY)
287
- glDisableClientState(GL_NORMAL_ARRAY)
288
-
289
- if o.has_texture?
290
- glDisableClientState(GL_TEXTURE_COORD_ARRAY)
291
- glDisable(GL_TEXTURE_2D)
292
- end
293
-
294
- glDisable(GL_COLOR_MATERIAL)
295
- end
296
- end
297
- end
298
- end
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_vec3("cameraPosition", 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
+ lights.each_with_index do |light, _i|
158
+ shader.uniform_integer("light[0].type", light.type)
159
+ shader.uniform_vec3("light[0].direction", light.direction)
160
+ shader.uniform_vec3("light[0].position", light.position)
161
+ shader.uniform_vec3("light[0].diffuse", light.diffuse)
162
+ shader.uniform_vec3("light[0].ambient", light.ambient)
163
+ shader.uniform_vec3("light[0].specular", light.specular)
164
+
165
+ glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
166
+ end
167
+
168
+ glBindVertexArray(0)
169
+ end
170
+ end
171
+
172
+ def post_processing
173
+ end
174
+
175
+ def render_framebuffer
176
+ if Shader.available?("lighting")
177
+ Shader.use("lighting") do |shader|
178
+ glBindVertexArray(@g_buffer.screen_vbo)
179
+
180
+ glDisable(GL_DEPTH_TEST)
181
+ glEnable(GL_BLEND)
182
+
183
+ glActiveTexture(GL_TEXTURE0)
184
+ glBindTexture(GL_TEXTURE_2D, @g_buffer.texture(:diffuse))
185
+ shader.uniform_integer("diffuse_texture", 0)
186
+
187
+ glDrawArrays(GL_TRIANGLES, 0, @g_buffer.vertices.size)
188
+
189
+ glBindVertexArray(0)
190
+ end
191
+ end
192
+ end
193
+
194
+ def draw_model(model, shader)
195
+ glBindVertexArray(model.vertex_array_id)
196
+ glEnableVertexAttribArray(0)
197
+ glEnableVertexAttribArray(1)
198
+ glEnableVertexAttribArray(2)
199
+ if model.has_texture?
200
+ glEnableVertexAttribArray(3)
201
+ glEnableVertexAttribArray(4)
202
+ end
203
+
204
+ if @show_wireframe
205
+ glLineWidth(2)
206
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
207
+ Shader.active_shader.uniform_boolean("disableLighting", true)
208
+
209
+ glDrawArrays(GL_TRIANGLES, 0, model.faces.count * 3)
210
+
211
+ Shader.active_shader.uniform_boolean("disableLighting", false)
212
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
213
+ glLineWidth(1)
214
+ end
215
+
216
+ offset = 0
217
+ model.objects.each do |object|
218
+ shader.uniform_boolean("hasTexture", object.has_texture?)
219
+
220
+ if object.has_texture?
221
+ glBindTexture(GL_TEXTURE_2D, object.materials.find { |mat| mat.texture_id }.texture_id)
222
+ else
223
+ glBindTexture(GL_TEXTURE_2D, 0)
224
+ end
225
+
226
+ glDrawArrays(GL_TRIANGLES, offset, object.faces.count * 3)
227
+ offset += object.faces.count * 3
228
+ end
229
+
230
+ if model.has_texture?
231
+ glDisableVertexAttribArray(4)
232
+ glDisableVertexAttribArray(3)
233
+
234
+ glBindTexture(GL_TEXTURE_2D, 0)
235
+ end
236
+ glDisableVertexAttribArray(2)
237
+ glDisableVertexAttribArray(1)
238
+ glDisableVertexAttribArray(0)
239
+
240
+ glBindBuffer(GL_ARRAY_BUFFER, 0)
241
+ glBindVertexArray(0)
242
+ end
243
+
244
+ def draw_mesh(model)
245
+ model.objects.each_with_index do |o, _i|
246
+ glEnable(GL_COLOR_MATERIAL)
247
+ glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE)
248
+ glShadeModel(GL_FLAT) unless o.faces.first[4]
249
+ glShadeModel(GL_SMOOTH) if o.faces.first[4]
250
+ glEnableClientState(GL_VERTEX_ARRAY)
251
+ glEnableClientState(GL_COLOR_ARRAY)
252
+ glEnableClientState(GL_NORMAL_ARRAY)
253
+
254
+ if o.has_texture?
255
+ glEnable(GL_TEXTURE_2D)
256
+ glBindTexture(GL_TEXTURE_2D, o.materials.find { |mat| mat.texture_id }.texture_id)
257
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY)
258
+ glTexCoordPointer(3, GL_FLOAT, 0, o.flattened_uvs)
259
+ end
260
+
261
+ glVertexPointer(4, GL_FLOAT, 0, o.flattened_vertices)
262
+ glColorPointer(3, GL_FLOAT, 0, o.flattened_materials)
263
+ glNormalPointer(GL_FLOAT, 0, o.flattened_normals)
264
+
265
+ if @show_wireframe # This is kinda expensive
266
+ glDisable(GL_LIGHTING)
267
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
268
+ glPolygonOffset(2, 0.5)
269
+ glLineWidth(3)
270
+
271
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
272
+
273
+ glLineWidth(1)
274
+ glPolygonOffset(0, 0)
275
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
276
+ glEnable(GL_LIGHTING)
277
+
278
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
279
+ else
280
+ glDrawArrays(GL_TRIANGLES, 0, o.flattened_vertices_size / 4)
281
+ end
282
+
283
+ # glBindBuffer(GL_ARRAY_BUFFER, 0)
284
+
285
+ glDisableClientState(GL_VERTEX_ARRAY)
286
+ glDisableClientState(GL_COLOR_ARRAY)
287
+ glDisableClientState(GL_NORMAL_ARRAY)
288
+
289
+ if o.has_texture?
290
+ glDisableClientState(GL_TEXTURE_COORD_ARRAY)
291
+ glDisable(GL_TEXTURE_2D)
292
+ end
293
+
294
+ glDisable(GL_COLOR_MATERIAL)
295
+ end
296
+ end
297
+ end
298
+ end
@@ -1,22 +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
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