Module: Jolt::Conversions

Defined in:
lib/jolt/conversions.rb

Class Method Summary collapse

Class Method Details

.components(value, count, name) ⇒ Object



67
68
69
70
71
72
73
74
# File 'lib/jolt/conversions.rb', line 67

def components(value, count, name)
  values = value.respond_to?(:to_a) ? value.to_a : nil
  unless values&.length == count
    raise InvalidArgumentError, "#{name} must contain exactly #{count} components"
  end

  values.map.with_index { |component, index| finite_float(component, "#{name}[#{index}]") }
end

.finite_float(value, name) ⇒ Object



58
59
60
61
62
63
64
65
# File 'lib/jolt/conversions.rb', line 58

def finite_float(value, name)
  number = Float(value)
  raise InvalidArgumentError, "#{name} must be finite" unless number.finite?

  number
rescue TypeError, ArgumentError
  raise InvalidArgumentError, "#{name} must be a number"
end

.native_quat(value, name: "rotation") ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/jolt/conversions.rb', line 16

def native_quat(value, name: "rotation")
  values = components(value, 4, name)
  length = Math.sqrt(values.sum { |component| component * component })
  raise InvalidArgumentError, "#{name} must not be a zero quaternion" if length <= Float::EPSILON

  values.map! { |component| component / length }
  Native::Quat.new.tap do |native|
    native[:x], native[:y], native[:z], native[:w] = values
  end
end

.native_unit_vec3(value, name:) ⇒ Object



27
28
29
30
31
32
33
34
# File 'lib/jolt/conversions.rb', line 27

def native_unit_vec3(value, name:)
  native = native_vec3(value, name:)
  length = Math.sqrt(%i[x y z].sum { |component| native[component]**2 })
  raise InvalidArgumentError, "#{name} must not be zero" if length <= Float::EPSILON

  %i[x y z].each { |component| native[component] /= length }
  native
end

.native_vec3(value, name: "vector") ⇒ Object



9
10
11
12
13
14
# File 'lib/jolt/conversions.rb', line 9

def native_vec3(value, name: "vector")
  values = components(value, 3, name)
  Native::Vec3.new.tap do |native|
    native[:x], native[:y], native[:z] = values
  end
end

.non_negative_float(value, name) ⇒ Object



51
52
53
54
55
56
# File 'lib/jolt/conversions.rb', line 51

def non_negative_float(value, name)
  number = finite_float(value, name)
  raise InvalidArgumentError, "#{name} must be non-negative" if number.negative?

  number
end

.positive_float(value, name) ⇒ Object



44
45
46
47
48
49
# File 'lib/jolt/conversions.rb', line 44

def positive_float(value, name)
  number = finite_float(value, name)
  raise InvalidArgumentError, "#{name} must be greater than zero" unless number.positive?

  number
end

.quat(native) ⇒ Object



40
41
42
# File 'lib/jolt/conversions.rb', line 40

def quat(native)
  Larb::Quat.new(native[:x], native[:y], native[:z], native[:w])
end

.vec3(native) ⇒ Object



36
37
38
# File 'lib/jolt/conversions.rb', line 36

def vec3(native)
  Larb::Vec3.new(native[:x], native[:y], native[:z])
end