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
|