Class: Rendering::InstanceRenderer
- Inherits:
-
Object
- Object
- Rendering::InstanceRenderer
- Defined in:
- lib/engine/rendering/instance_renderer.rb
Constant Summary collapse
- FLOATS_PER_MATRIX =
16- BYTES_PER_MATRIX =
FLOATS_PER_MATRIX * Fiddle::SIZEOF_FLOAT
Instance Attribute Summary collapse
-
#material ⇒ Object
readonly
Returns the value of attribute material.
-
#mesh ⇒ Object
readonly
Returns the value of attribute mesh.
Instance Method Summary collapse
- #add_instance(mesh_renderer) ⇒ Object
- #draw_all ⇒ Object
- #draw_depth_only(light_space_matrix) ⇒ Object
- #draw_point_light_depth(light_space_matrix, light_pos, far_plane) ⇒ Object
-
#initialize(mesh, material) ⇒ InstanceRenderer
constructor
A new instance of InstanceRenderer.
- #remove_instance(mesh_renderer) ⇒ Object
- #update_instance(mesh_renderer) ⇒ Object
Constructor Details
#initialize(mesh, material) ⇒ InstanceRenderer
Returns a new instance of InstanceRenderer.
10 11 12 13 14 15 16 17 18 19 20 21 |
# File 'lib/engine/rendering/instance_renderer.rb', line 10 def initialize(mesh, material) @mesh = mesh @material = material @mesh_renderers = [] @packed_data = String.new(encoding: Encoding::BINARY) setup_vertex_attribute_buffer setup_vertex_buffer setup_index_buffer generate_instance_vbo_buf Engine::GL.BindVertexArray(0) end |
Instance Attribute Details
#material ⇒ Object (readonly)
Returns the value of attribute material.
5 6 7 |
# File 'lib/engine/rendering/instance_renderer.rb', line 5 def material @material end |
#mesh ⇒ Object (readonly)
Returns the value of attribute mesh.
5 6 7 |
# File 'lib/engine/rendering/instance_renderer.rb', line 5 def mesh @mesh end |
Instance Method Details
#add_instance(mesh_renderer) ⇒ Object
23 24 25 26 27 |
# File 'lib/engine/rendering/instance_renderer.rb', line 23 def add_instance(mesh_renderer) @mesh_renderers << mesh_renderer floats = mesh_renderer.game_object.model_matrix.to_a.flatten @packed_data << floats.pack('F*') end |
#draw_all ⇒ Object
44 45 46 47 48 49 50 51 52 53 |
# File 'lib/engine/rendering/instance_renderer.rb', line 44 def draw_all set_material_per_frame_data Engine::GL.BindVertexArray(@vao) update_vbo_buf Engine::GL.BindBuffer(Engine::GL::ELEMENT_ARRAY_BUFFER, @ebo) Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, @instance_vbo) Engine::GL.DrawElementsInstanced(Engine::GL::TRIANGLES, mesh.index_data.length, Engine::GL::UNSIGNED_INT, 0, @mesh_renderers.count) end |
#draw_depth_only(light_space_matrix) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/engine/rendering/instance_renderer.rb', line 55 def draw_depth_only(light_space_matrix) return if @mesh_renderers.empty? shadow_shader = Engine::Shader.shadow shadow_shader.use shadow_shader.set_mat4("lightSpaceMatrix", light_space_matrix) Engine::GL.BindVertexArray(@vao) update_vbo_buf Engine::GL.BindBuffer(Engine::GL::ELEMENT_ARRAY_BUFFER, @ebo) Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, @instance_vbo) Engine::GL.DrawElementsInstanced(Engine::GL::TRIANGLES, mesh.index_data.length, Engine::GL::UNSIGNED_INT, 0, @mesh_renderers.count) end |
#draw_point_light_depth(light_space_matrix, light_pos, far_plane) ⇒ Object
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/engine/rendering/instance_renderer.rb', line 70 def draw_point_light_depth(light_space_matrix, light_pos, far_plane) return if @mesh_renderers.empty? shader = Engine::Shader.point_shadow shader.use shader.set_mat4("lightSpaceMatrix", light_space_matrix) shader.set_vec3("lightPos", light_pos) shader.set_float("farPlane", far_plane) Engine::GL.BindVertexArray(@vao) update_vbo_buf Engine::GL.BindBuffer(Engine::GL::ELEMENT_ARRAY_BUFFER, @ebo) Engine::GL.BindBuffer(Engine::GL::ARRAY_BUFFER, @instance_vbo) Engine::GL.DrawElementsInstanced(Engine::GL::TRIANGLES, mesh.index_data.length, Engine::GL::UNSIGNED_INT, 0, @mesh_renderers.count) end |
#remove_instance(mesh_renderer) ⇒ Object
29 30 31 32 33 34 35 |
# File 'lib/engine/rendering/instance_renderer.rb', line 29 def remove_instance(mesh_renderer) index = @mesh_renderers.index(mesh_renderer) @mesh_renderers.delete_at(index) # Remove this instance's bytes from packed data byte_offset = index * BYTES_PER_MATRIX @packed_data[byte_offset, BYTES_PER_MATRIX] = '' end |
#update_instance(mesh_renderer) ⇒ Object
37 38 39 40 41 42 |
# File 'lib/engine/rendering/instance_renderer.rb', line 37 def update_instance(mesh_renderer) index = @mesh_renderers.index(mesh_renderer) floats = mesh_renderer.game_object.model_matrix.to_a.flatten byte_offset = index * BYTES_PER_MATRIX @packed_data[byte_offset, BYTES_PER_MATRIX] = floats.pack('F*') end |