Module: Jolt::Conversions
- Defined in:
- lib/jolt/conversions.rb
Class Method Summary collapse
- .components(value, count, name) ⇒ Object
- .finite_float(value, name) ⇒ Object
- .native_quat(value, name: "rotation") ⇒ Object
- .native_unit_vec3(value, name:) ⇒ Object
- .native_vec3(value, name: "vector") ⇒ Object
- .non_negative_float(value, name) ⇒ Object
- .positive_float(value, name) ⇒ Object
- .quat(native) ⇒ Object
- .vec3(native) ⇒ Object
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 |