Module: Stagecraft::Renderer::Features

Defined in:
lib/stagecraft/renderer/features.rb

Constant Summary collapse

ORDER =
%i[
  HAS_UV HAS_NORMAL HAS_TANGENT HAS_VERTEX_COLOR HAS_BASECOLOR_MAP HAS_MR_MAP
  HAS_NORMAL_MAP HAS_OCCLUSION_MAP HAS_EMISSIVE_MAP SKINNED ALPHA_MASK DOUBLE_SIDED
].freeze
ATTRIBUTE_FEATURES =
{
  uv: :HAS_UV,
  uv1: :HAS_UV1,
  normal: :HAS_NORMAL,
  tangent: :HAS_TANGENT,
  color: :HAS_VERTEX_COLOR
}.freeze

Class Method Summary collapse

Class Method Details

.bits(features) ⇒ Object



32
33
34
# File 'lib/stagecraft/renderer/features.rb', line 32

def bits(features)
  ORDER.each_with_index.sum { |feature, index| features.include?(feature) ? (1 << index) : 0 }
end

.for(mesh) ⇒ Object



22
23
24
25
26
27
28
29
30
# File 'lib/stagecraft/renderer/features.rb', line 22

def for(mesh)
  values = Set.new
  ATTRIBUTE_FEATURES.each { |attribute, feature| values << feature if mesh.geometry.attribute(attribute) }
  color = mesh.geometry.attribute(:color)
  values << :COLOR_VEC3 if color && color.components == 3
  material_features(mesh.material, values)
  values << :SKINNED if mesh.skin
  values.freeze
end

.vertex_layout_id(geometry) ⇒ Object



36
37
38
39
40
41
42
# File 'lib/stagecraft/renderer/features.rb', line 36

def vertex_layout_id(geometry)
  [
    geometry.topology,
    geometry.index&.format,
    geometry.attributes.sort_by(&:first).map { |name, attribute| [name, attribute.format] }
  ].hash
end