Class: Jolt::Layers::Builder

Inherits:
Object
  • Object
show all
Defined in:
lib/jolt/layers.rb

Instance Method Summary collapse

Constructor Details

#initializeBuilder

Returns a new instance of Builder.



46
47
48
49
50
51
# File 'lib/jolt/layers.rb', line 46

def initialize
  @broad_phase_layers = {}
  @object_layers = {}
  @mappings = {}
  @collisions = Set.new
end

Instance Method Details

#broad_phase(*names) ⇒ Object



53
54
55
# File 'lib/jolt/layers.rb', line 53

def broad_phase(*names)
  names.each { |name| add_named_layer(@broad_phase_layers, name, 256, "broad-phase") }
end

#buildObject



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/jolt/layers.rb', line 73

def build
  raise InvalidArgumentError, "at least one broad-phase layer is required" if @broad_phase_layers.empty?
  raise InvalidArgumentError, "at least one object layer is required" if @object_layers.empty?

  missing_mappings = @mappings.values.reject { |name| @broad_phase_layers.key?(name) }.uniq
  unless missing_mappings.empty?
    raise InvalidArgumentError, "unknown broad-phase layer(s): #{missing_mappings.join(", ")}"
  end

  collision_names = @collisions.to_a.flatten.uniq
  missing_collisions = collision_names.reject { |name| @object_layers.key?(name) }
  unless missing_collisions.empty?
    raise InvalidArgumentError, "unknown collision layer(s): #{missing_collisions.join(", ")}"
  end

  Layers.new(
    object_layers: @object_layers.dup,
    broad_phase_layers: @broad_phase_layers.dup,
    mappings: @mappings.dup,
    collisions: @collisions.to_a
  )
end

#collide(layer, with:) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/jolt/layers.rb', line 65

def collide(layer, with:)
  first = normalize_name(layer)
  Array(with).each do |other|
    second = normalize_name(other)
    @collisions << [first, second].sort.freeze
  end
end

#object(*names, broad_phase:) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/jolt/layers.rb', line 57

def object(*names, broad_phase:)
  broad_name = normalize_name(broad_phase)
  names.each do |name|
    object_name = add_named_layer(@object_layers, name, nil, "object")
    @mappings[object_name] = broad_name
  end
end