Class: Stagecraft::Renderer::UniformPacker

Inherits:
Object
  • Object
show all
Defined in:
lib/stagecraft/renderer/uniform_packer.rb

Defined Under Namespace

Classes: Field, Result

Constant Summary collapse

TYPE_INFO =
{
  f32: [4, 4], u32: [4, 4],
  vec2f: [8, 8], vec3f: [16, 12], vec4f: [16, 16],
  mat4x4f: [16, 64]
}.freeze

Instance Method Summary collapse

Instance Method Details

#pack(uniforms = nil, struct_name: "MaterialUniforms", **keyword_uniforms) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/stagecraft/renderer/uniform_packer.rb', line 15

def pack(uniforms = nil, struct_name: "MaterialUniforms", **keyword_uniforms)
  uniforms = (uniforms || {}).merge(keyword_uniforms)
  offset = 0
  fields = []
  textures = []
  uniforms.each do |name, value|
    if texture?(value)
      textures << [name.to_sym, value]
      next
    end

    type, normalized = infer(value)
    alignment, size = TYPE_INFO.fetch(type)
    offset = align(offset, alignment)
    fields << Field.new(name: name.to_sym, type:, offset:, size:, alignment:, value: normalized)
    offset += size
  end
  total_size = align(offset, [fields.map(&:alignment).max || 1, 16].max)
  bytes = "\0".b * total_size
  fields.each { |field| write(bytes, field) }
  Result.new(
    bytes: bytes.freeze,
    fields: fields.freeze,
    struct_source: declaration(struct_name, fields),
    textures: textures.freeze
  )
end