Class: Stagecraft::PhysicsBinding

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

Defined Under Namespace

Classes: Entry

Instance Method Summary collapse

Constructor Details

#initializePhysicsBinding

Returns a new instance of PhysicsBinding.



7
8
9
# File 'lib/stagecraft/physics_binding.rb', line 7

def initialize
  @entries = []
end

Instance Method Details

#bind(node, body) ⇒ Object

Raises:

  • (ArgumentError)


11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/stagecraft/physics_binding.rb', line 11

def bind(node, body)
  raise ArgumentError, "physics binding requires a Stagecraft::Node" unless node.is_a?(Node)

  validate_body!(body)
  unbind(node)
  @entries << Entry.new(
    node:,
    body:,
    previous_position: vector(body.position),
    previous_rotation: quaternion(body.rotation)
  )
  self
end

#sync!(alpha = 1.0) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/stagecraft/physics_binding.rb', line 30

def sync!(alpha = 1.0)
  amount = Float(alpha).clamp(0.0, 1.0)
  @entries.map! do |entry|
    current_position = vector(entry.body.position)
    current_rotation = quaternion(entry.body.rotation)
    entry.node.position.set(entry.previous_position.lerp(current_position, amount))
    entry.node.rotation.set(entry.previous_rotation.slerp(current_rotation, amount))
    Entry.new(
      node: entry.node,
      body: entry.body,
      previous_position: current_position,
      previous_rotation: current_rotation
    )
  end
  self
end

#unbind(node) ⇒ Object



25
26
27
28
# File 'lib/stagecraft/physics_binding.rb', line 25

def unbind(node)
  @entries.reject! { |entry| entry.node.equal?(node) }
  self
end