class FlameChannelParser::FramecurveWriters::SoftfxTimewarp

Writes out a framecurve setup

Constants

DATETIME_FORMAT
TIME

Public Class Methods

extension() click to toggle source
# File lib/framecurve_writers/softfx_timewarp.rb, line 6
def self.extension
  '.timewarp'
end

Public Instance Methods

run_export(io) { |writer| ... } click to toggle source
# File lib/framecurve_writers/softfx_timewarp.rb, line 10
def run_export(io)
  w = FlameChannelParser::Builder.new(io)
  
  w.timewarp_file_version "1.0"
  w.creation_date(TIME.strftime(DATETIME_FORMAT))
  w.linebreak(2)
  w.fields 0
  w.origin 1
  w.render_type false
  w.sampling_step 0
  w.interpolation 0
  w.flow_quality 0
  w.linebreak!(2)
  
  # Accumulate all the keys
  writer = KeyWriter.new
  yield(writer)
  speeds = generate_speed(writer.keys)
  
  # Compute intermediate frames and speeds
  w.animation do | anim |
    anim.channel("Speed") do | speed | 
      write_animation(speeds, speed, :constant)
    end
    anim.channel("Timing/Timing") do | c |
      write_animation(writer.keys, c, :linear)
    end
  end
  
end

Private Instance Methods

generate_speed(keys) click to toggle source

Tricky bitch

# File lib/framecurve_writers/softfx_timewarp.rb, line 68
def generate_speed(keys)
  speeds = []
  keys.each_with_index do | key, idx |
    next_key = keys[idx + 1]
    percentage = if next_key.nil? # Last frame here!
      0.0
    else
      get_percentage(key, next_key)
    end
    speeds.push([key[0], percentage])
  end
  
  speeds
end
get_percentage(key, next_key) click to toggle source
# File lib/framecurve_writers/softfx_timewarp.rb, line 60
def get_percentage(key, next_key)
  delta_y = next_key[1] - key[1]
  delta_t = next_key[0] - key[0]
  one_frame_differential = delta_y.to_f / delta_t
  percentage = one_frame_differential * 100
end
write_animation(tuples, writer, interp = :linear) click to toggle source
# File lib/framecurve_writers/softfx_timewarp.rb, line 43
def write_animation(tuples, writer, interp = :linear)
  writer.value tuples[0][1]
  writer.extrapolation :constant
  writer.key_version 1
  writer.size tuples.length
  tuples.each_with_index do | tuple, i |
    at, value = tuple
    writer.key(i) do | k |
      k.frame at
      k.value value.to_f
      k.interpolation interp
      k.left_slope 2.4
      k.right_slope 2.4
    end
  end
end