Class: Rendering::InstanceRenderer

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

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

#materialObject (readonly)

Returns the value of attribute material.



5
6
7
# File 'lib/engine/rendering/instance_renderer.rb', line 5

def material
  @material
end

#meshObject (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_allObject



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