tracksperanto 1.9.8 → 1.9.9

Sign up to get free protection for your applications and to get access to all the features.
data/Manifest.txt CHANGED
@@ -58,6 +58,7 @@ lib/tracksperanto/simple_export.rb
58
58
  lib/tracksperanto/tracker.rb
59
59
  lib/tracksperanto/uv_coordinates.rb
60
60
  lib/tracksperanto/zip_tuples.rb
61
+ lib/tracksperanto/accumulator.rb
61
62
  test/export/README_EXPORT_TESTS.txt
62
63
  test/export/samples/ref_Mayalive.txt
63
64
  test/export/samples/ref_Mayalive_CustomAspect.txt
data/bin/tracksperanto CHANGED
@@ -5,7 +5,7 @@
5
5
  #
6
6
  # == Usage
7
7
  #
8
- # tracksperanto -f ShakeScript -w 1920 -h 1080 /Films/Blockbuster/Shots/001/script.shk
8
+ # tracksperanto -w 1920 -h 1080 /Films/Blockbuster/Shots/001/script.shk --only flamestabilizer
9
9
  #
10
10
  # == Author
11
11
  # Julik <me@julik.nl>
data/lib/import/base.rb CHANGED
@@ -8,6 +8,9 @@ class Tracksperanto::Import::Base
8
8
  include Tracksperanto::ZipTuples
9
9
  include Tracksperanto::ConstName
10
10
 
11
+ # Every time the importer accumulates a tracker this block will be called
12
+ attr_accessor :receiver
13
+
11
14
  # Tracksperanto will assign a proc that reports the status of the import to the caller.
12
15
  # This block is automatically used by report_progress IF the proc is assigned. Should
13
16
  # the proc be nil, the report_progress method will just pass (so you don't need to check for nil
@@ -60,12 +63,30 @@ class Tracksperanto::Import::Base
60
63
  @progress_block.call(message) if @progress_block
61
64
  end
62
65
 
66
+ # OBSOLETE: do not implement this method in your importer. This is used to accumulate trackers in an array
67
+ # and then send it to the caller. Used in tests.
68
+ def parse(track_file_io)
69
+ @receiver = []
70
+ class << @receiver
71
+ def call(with)
72
+ push(with)
73
+ end
74
+ end
75
+
76
+ stream_parse(track_file_io)
77
+ @receiver
78
+ end
79
+
63
80
  # The main method of the parser. Will receive an IO handle to the file being imported, and should
64
- # return an array of Tracksperanto::Tracker objects containing keyframes. If you have a problem
65
- # doing an import, raise from here. Note that in general it's a good idea to stream-parse a document
81
+ # send each consecutive tracker via the send_tracker method.
82
+ # Note that in general it's a good idea to stream-parse a document
66
83
  # instead of bulk-reading it into memory (since Tracksperanto tries to be mem-efficient when dealing
67
84
  # with large files)
68
- def parse(track_file_io)
69
- []
85
+ def stream_parse(track_file_io)
86
+ end
87
+
88
+ # When a tracker has been detected completely (all keyframes) call this method with the tracker object as argument
89
+ def send_tracker(tracker_obj)
90
+ @receiver.call(tracker_obj) if @receiver
70
91
  end
71
92
  end
data/lib/import/boujou.rb CHANGED
@@ -4,16 +4,25 @@ class Tracksperanto::Import::Boujou < Tracksperanto::Import::Base
4
4
  "Boujou feature tracks export"
5
5
  end
6
6
 
7
- def parse(io)
7
+ def stream_parse(io)
8
8
  wrapped_io = Tracksperanto::ExtIO.new(io)
9
9
  detect_columns(wrapped_io)
10
10
  trackers = {}
11
11
  filtering_trackers_from(wrapped_io) do | name, frame, x, y |
12
- trackers[name] ||= Tracksperanto::Tracker.new(:name => name)
12
+ if @last_tracker && (name != @last_tracker.name)
13
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
14
+ @last_tracker = nil
15
+ end
16
+
17
+ if !@last_tracker
18
+ @last_tracker = Tracksperanto::Tracker.new(:name => name)
19
+ end
20
+
13
21
  report_progress("Extracting frame #{frame} of #{name}")
14
- trackers[name].keyframe!(:frame => (frame.to_i - 1), :abs_y => (@height.to_f - y.to_f), :abs_x => x)
22
+ @last_tracker.keyframe!(:frame => (frame.to_i - 1), :abs_y => (@height.to_f - y.to_f), :abs_x => x)
15
23
  end
16
- trackers.values.sort{|a,b| a.name <=> b.name }
24
+
25
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
17
26
  end
18
27
 
19
28
  private
@@ -9,9 +9,8 @@ class Tracksperanto::Import::Equalizer3 < Tracksperanto::Import::Base
9
9
  true
10
10
  end
11
11
 
12
- def parse(passed_io)
12
+ def stream_parse(passed_io)
13
13
  io = Tracksperanto::ExtIO.new(passed_io)
14
-
15
14
  detect_format!(io)
16
15
  extract_trackers(io)
17
16
  end
@@ -24,31 +23,22 @@ class Tracksperanto::Import::Equalizer3 < Tracksperanto::Import::Base
24
23
  end
25
24
 
26
25
  def extract_trackers(io)
27
- ts = []
28
26
  while line = io.gets do
29
27
  if line =~ /^(\w+)/ # Tracker name
30
- discard_last_empty_tracker!(ts)
31
- ts.push(Tracksperanto::Tracker.new(:name => line.strip))
28
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
29
+ @last_tracker = Tracksperanto::Tracker.new(:name => line.strip)
32
30
  report_progress("Capturing tracker #{line.strip}")
33
31
  elsif line =~ /^\t/
34
- ts[-1].push(make_keyframe(line))
32
+ @last_tracker.keyframe!(make_keyframe(line))
35
33
  end
36
34
  end
37
35
 
38
- discard_last_empty_tracker!(ts)
39
- ts
40
- end
41
-
42
- def discard_last_empty_tracker!(in_array)
43
- if (in_array.any? && in_array[-1].empty?)
44
- in_array.delete_at(-1)
45
- report_progress("Removing the last tracker since it had no keyframes")
46
- end
36
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
47
37
  end
48
38
 
49
39
  def make_keyframe(from_line)
50
40
  frame, x, y = from_line.split
51
41
  report_progress("Capturing keyframe #{frame}")
52
- Tracksperanto::Keyframe.new(:frame => (frame.to_i - 1), :abs_x => x, :abs_y => y)
42
+ {:frame => (frame.to_i - 1), :abs_x => x, :abs_y => y}
53
43
  end
54
44
  end
@@ -6,14 +6,10 @@ class Tracksperanto::Import::Equalizer4 < Tracksperanto::Import::Base
6
6
  end
7
7
 
8
8
 
9
- def parse(passed_io)
10
- ts = []
9
+ def stream_parse(passed_io)
11
10
  io = Tracksperanto::ExtIO.new(passed_io)
12
-
13
11
  num_t = detect_num_of_points(io)
14
- num_t.times { ts << extract_tracker(io) }
15
-
16
- ts
12
+ num_t.times { send_tracker(extract_tracker(io)) }
17
13
  end
18
14
 
19
15
  private
@@ -71,7 +71,7 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
71
71
  private :to_ary
72
72
  end
73
73
 
74
- def parse(io)
74
+ def stream_parse(io)
75
75
  report_progress("Extracting setup size")
76
76
  self.width, self.height = extract_width_and_height_from_stream(io)
77
77
  report_progress("Extracting all animation channels")
@@ -81,7 +81,7 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
81
81
  raise "A channel was nil" if channels.find{|e| e.nil? }
82
82
 
83
83
  report_progress("Assembling tracker curves from channels")
84
- scavenge_trackers_from_channels(channels)
84
+ scavenge_trackers_from_channels(channels) {|t| send_tracker(t) }
85
85
  end
86
86
 
87
87
  private
@@ -154,6 +154,12 @@ Channel tracker1/ref/x
154
154
  end
155
155
 
156
156
  USEFUL_CHANNELS = %w( /shift/x /shift/y /ref/x /ref/y ).map(&Regexp.method(:new))
157
+
158
+ # This method tells the importer whether a channel that has been found in the source
159
+ # setup is needed. If that method returns ++false++ the channel will be discarded and not
160
+ # kept in memory. Should you need to write a module that scavenges other Flame animation channels
161
+ # inherit from this class and rewrite this method to either return +true+ always (then all the channels
162
+ # will be recovered) or to return +true+ only for channels that you actually need.
157
163
  def channel_is_useful?(channel_name)
158
164
  USEFUL_CHANNELS.any?{|e| channel_name =~ e }
159
165
  end
@@ -161,13 +167,10 @@ Channel tracker1/ref/x
161
167
  REF_CHANNEL = "ref" # or "track" - sometimes works sometimes don't
162
168
 
163
169
  def scavenge_trackers_from_channels(channels)
164
- trackers = []
165
170
  channels.select{|e| e.name =~ /\/#{REF_CHANNEL}\/x/}.each do | track_x |
166
171
  report_progress("Detected reference channel #{track_x}")
167
- trackers << grab_tracker(channels, track_x)
172
+ yield grab_tracker(channels, track_x)
168
173
  end
169
-
170
- trackers
171
174
  end
172
175
 
173
176
  def grab_tracker(channels, track_x)
@@ -12,10 +12,10 @@ class Tracksperanto::Import::MatchMover < Tracksperanto::Import::Base
12
12
  ".rz2"
13
13
  end
14
14
 
15
- def parse(io)
15
+ def stream_parse(io)
16
16
  trackers = []
17
17
  detect_format(io)
18
- extract_trackers(io)
18
+ extract_trackers(io) { |t| send_tracker(t) }
19
19
  end
20
20
 
21
21
  private
@@ -29,11 +29,9 @@ class Tracksperanto::Import::MatchMover < Tracksperanto::Import::Base
29
29
  end
30
30
 
31
31
  def extract_trackers(io)
32
- tracks = []
33
32
  while(line = io.gets) do
34
- tracks << extract_track(line, io) if line =~ /^pointTrack/
33
+ yield(extract_track(line, io)) if line =~ /^pointTrack/
35
34
  end
36
- tracks
37
35
  end
38
36
 
39
37
  def extract_track(start_line, io)
@@ -15,24 +15,24 @@ class Tracksperanto::Import::MayaLive < Tracksperanto::Import::Base
15
15
 
16
16
  COMMENT = /^# /
17
17
 
18
- def parse(original_io)
18
+ def stream_parse(original_io)
19
19
  io = Tracksperanto::ExtIO.new(original_io)
20
20
  extract_width_height_and_aspect(io.gets_non_empty)
21
- trackers = []
22
21
 
23
22
  while line = io.gets_and_strip
24
23
  if line =~ COMMENT
25
- trackers << Tracksperanto::Tracker.new(:name => line.gsub(/#{COMMENT} Name(\s+)/, ''))
24
+ send_tracker(@last_tracker) if @last_tracker
25
+ @last_tracker = Tracksperanto::Tracker.new(:name => line.gsub(/#{COMMENT} Name(\s+)/, ''))
26
26
  next
27
27
  end
28
28
 
29
29
  tracker_num, frame, x, y, residual = line.split
30
30
 
31
31
  abs_x, abs_y = aspect_values_to_pixels(x, y)
32
- trackers[-1].keyframe! :frame => frame, :abs_x => abs_x, :abs_y => abs_y, :residual => set_residual(residual)
32
+ @last_tracker.keyframe! :frame => frame, :abs_x => abs_x, :abs_y => abs_y, :residual => set_residual(residual)
33
33
  end
34
34
 
35
- trackers
35
+ send_tracker(@last_tracker) if @last_tracker
36
36
  end
37
37
 
38
38
  private
@@ -10,8 +10,14 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
10
10
  ".nk"
11
11
  end
12
12
 
13
- def parse(io)
14
- scan_for_tracker3_nodes(Tracksperanto::ExtIO.new(io))
13
+ def stream_parse(in_io)
14
+ io = Tracksperanto::ExtIO.new(in_io)
15
+ while line = io.gets_and_strip
16
+ if line =~ TRACKER_3_PATTERN
17
+ scan_tracker_node(io).each { |t| send_tracker(t) }
18
+ end
19
+ end
20
+
15
21
  end
16
22
 
17
23
  private
@@ -20,13 +26,6 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
20
26
  TRACK_PATTERN = /^track(\d) \{/
21
27
  NODENAME = /^name ([^\n]+)/
22
28
 
23
- def scan_for_tracker3_nodes(io)
24
- tracks = []
25
- while line = io.gets_and_strip
26
- tracks += scan_tracker_node(io) if line =~ TRACKER_3_PATTERN
27
- end
28
- tracks
29
- end
30
29
 
31
30
  def scan_tracker_node(io)
32
31
  tracks_in_tracker = []
@@ -9,8 +9,7 @@ class Tracksperanto::Import::PFTrack < Tracksperanto::Import::Base
9
9
 
10
10
  CHARACTERS_OR_QUOTES = /[AZaz"]/
11
11
 
12
- def parse(io)
13
- trackers = []
12
+ def stream_parse(io)
14
13
  until io.eof?
15
14
  line = io.gets
16
15
  next if (!line || line =~ /^#/)
@@ -19,11 +18,9 @@ class Tracksperanto::Import::PFTrack < Tracksperanto::Import::Base
19
18
  t = Tracksperanto::Tracker.new{|t| t.name = line.strip.gsub(/"/, '') }
20
19
  report_progress("Reading tracker #{t.name}")
21
20
  parse_tracker(t, io)
22
- trackers << t
21
+ send_tracker(t)
23
22
  end
24
23
  end
25
-
26
- trackers
27
24
  end
28
25
 
29
26
  private
@@ -35,10 +32,10 @@ class Tracksperanto::Import::PFTrack < Tracksperanto::Import::Base
35
32
  end
36
33
 
37
34
  num_of_keyframes = first_tracker_line.to_i
38
- t.keyframes = (1..num_of_keyframes).map do | keyframe_idx |
35
+ (1..num_of_keyframes).map do | keyframe_idx |
39
36
  report_progress("Reading keyframe #{keyframe_idx} of #{num_of_keyframes} in #{t.name}")
40
37
  f, x, y, residual = io.gets.chomp.split
41
- Tracksperanto::Keyframe.new(:frame => f, :abs_x => x, :abs_y => y, :residual => residual.to_f * 8)
38
+ t.keyframe!(:frame => f, :abs_x => x, :abs_y => y, :residual => residual.to_f * 8)
42
39
  end
43
40
  end
44
41
  end
@@ -25,8 +25,8 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
25
25
  node_name = atom[1][-1]
26
26
  trackers = atom[2][1][1..-1]
27
27
  trackers.map do | tracker |
28
- tracker.name = [node_name, tracker.name].join("_")
29
- sentinel[0].push(tracker)
28
+ tracker.name = [node_name, tracker.name].join("_")
29
+ sentinel[0].call(tracker)
30
30
  end
31
31
  end
32
32
 
@@ -239,11 +239,19 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
239
239
  end
240
240
  end
241
241
 
242
- def parse(script_io)
243
- trackers = []
242
+ class PushCall
243
+ def initialize(proc)
244
+ @proc = proc
245
+ end
246
+
247
+ def push(t)
248
+ @proc.call(t)
249
+ end
250
+ end
251
+
252
+ def stream_parse(script_io)
244
253
  progress_proc = lambda{|msg| report_progress(msg) }
245
- Traxtractor.new(script_io, [trackers, progress_proc])
246
- trackers
254
+ Traxtractor.new(script_io, [method(:send_tracker), progress_proc])
247
255
  end
248
256
 
249
257
  end
@@ -1,22 +1,22 @@
1
-
1
+ # Import for Shake Text files
2
2
  class Tracksperanto::Import::ShakeText < Tracksperanto::Import::Base
3
3
 
4
4
  def self.human_name
5
5
  "Shake .txt tracker file"
6
6
  end
7
7
 
8
- def parse(io)
9
- trackers = []
8
+ def stream_parse(io)
10
9
  io.each do | line |
11
10
  if line =~ /TrackName (.+)/
12
- trackers << Tracksperanto::Tracker.new{|t| t.name = $1 }
11
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
12
+ @last_tracker = Tracksperanto::Tracker.new{|t| t.name = $1 }
13
13
  # Toss the next following string - header
14
14
  io.gets
15
15
  else
16
16
  keyframe_values = line.split
17
17
  next if keyframe_values.length < 4
18
18
 
19
- trackers[-1].keyframes << Tracksperanto::Keyframe.new do | kf |
19
+ @last_tracker.keyframes << Tracksperanto::Keyframe.new do | kf |
20
20
  kf.frame = (keyframe_values[0].to_i - 1)
21
21
  kf.abs_x = keyframe_values[1]
22
22
  kf.abs_y = keyframe_values[2]
@@ -25,6 +25,7 @@ class Tracksperanto::Import::ShakeText < Tracksperanto::Import::Base
25
25
  end
26
26
  end
27
27
 
28
- trackers
28
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
29
29
  end
30
+
30
31
  end
@@ -5,29 +5,28 @@ class Tracksperanto::Import::Syntheyes < Tracksperanto::Import::Base
5
5
  "Syntheyes 2D tracker paths file"
6
6
  end
7
7
 
8
- def parse(io)
9
- trackers = []
8
+ def stream_parse(io)
10
9
  io.each_line do | line |
11
10
  name, frame, x, y, frame_status = line.split
12
11
 
13
12
  # Do we already have this tracker?
14
- t = trackers.find {|e| e.name == name}
15
- if !t
13
+ unless @last_tracker && @last_tracker.name == name
14
+ send_tracker(@last_tracker) if @last_tracker
16
15
  report_progress("Allocating tracker #{name}")
17
- t = Tracksperanto::Tracker.new{|t| t.name = name }
18
- trackers << t
16
+ @last_tracker = Tracksperanto::Tracker.new{|t| t.name = name }
19
17
  end
20
18
 
21
19
  # Add the keyframe
22
- t.keyframes << Tracksperanto::Keyframe.new do |e|
20
+ k = Tracksperanto::Keyframe.new do |e|
23
21
  e.frame = frame
24
22
  e.abs_x = convert_from_uv(width, x)
25
23
  e.abs_y = height - convert_from_uv(height, y) # Convert TL to BL
26
24
  end
25
+
26
+ @last_tracker.push(k)
27
27
  report_progress("Adding keyframe #{frame} to #{name}")
28
28
  end
29
+ send_tracker(@last_tracker) if @last_tracker && @last_tracker.any?
29
30
 
30
- trackers
31
31
  end
32
-
33
32
  end
data/lib/pipeline/base.rb CHANGED
@@ -116,25 +116,31 @@ class Tracksperanto::Pipeline::Base
116
116
  end
117
117
  @ios << io_with_progress
118
118
 
119
- trackers = importer.parse(io_with_progress)
120
- report_progress(percent_complete = 50.0, "Validating #{trackers.length} imported trackers")
119
+ accumulator = Tracksperanto::Accumulator.new
120
+ importer.receiver = accumulator
121
+ @ios << accumulator
121
122
 
122
- validate_trackers!(trackers)
123
+ importer.stream_parse(io_with_progress)
124
+
125
+ report_progress(percent_complete = 50.0, "Validating #{accumulator.length} imported trackers")
126
+ raise "Could not recover any non-empty trackers from this file. Wrong import format maybe?" if accumulator.numt.zero?
123
127
 
124
128
  report_progress(percent_complete, "Starting export")
125
129
 
126
- percent_per_tracker = (100.0 - percent_complete) / trackers.length
130
+ percent_per_tracker = (100.0 - percent_complete) / accumulator.numt
127
131
 
128
132
  # Use the width and height provided by the parser itself
129
133
  exporter.start_export(importer.width, importer.height)
130
- trackers.each_with_index do | t, tracker_idx |
134
+ accumulator.each_object_with_index do | t, tracker_idx |
135
+ raise "Not a Tracker" unless t.is_a?(Tracksperanto::Tracker)
136
+
131
137
  kf_weight = percent_per_tracker / t.keyframes.length
132
138
  points += 1
133
139
  exporter.start_tracker_segment(t.name)
134
140
  t.each_with_index do | kf, idx |
135
141
  keyframes += 1
136
142
  exporter.export_point(kf.frame, kf.abs_x, kf.abs_y, kf.residual)
137
- report_progress(percent_complete += kf_weight, "Writing keyframe #{idx+1} of #{t.name.inspect}, #{trackers.length - tracker_idx} trackers to go")
143
+ report_progress(percent_complete += kf_weight, "Writing keyframe #{idx+1} of #{t.name.inspect}, #{accumulator.numt - tracker_idx} trackers to go")
138
144
  end
139
145
  exporter.end_tracker_segment
140
146
  end
@@ -166,10 +172,4 @@ class Tracksperanto::Pipeline::Base
166
172
  @ios ||= []
167
173
  @ios.push(File.open(path_to_file, "wb"))[-1]
168
174
  end
169
-
170
- # Check that the trackers made by the parser are A-OK
171
- def validate_trackers!(trackers)
172
- trackers.reject!{|t| t.empty? }
173
- raise "Could not recover any non-empty trackers from this file. Wrong import format maybe?" if trackers.empty?
174
- end
175
175
  end
@@ -0,0 +1,33 @@
1
+ class Tracksperanto::Accumulator < DelegateClass(IO)
2
+
3
+ attr_reader :numt
4
+ def initialize
5
+ __setobj__(Tracksperanto::BufferIO.new)
6
+ @numt = 0
7
+ end
8
+
9
+ def call(with_arrived_tracker)
10
+
11
+ @numt += 1
12
+
13
+ d = Marshal.dump(with_arrived_tracker)
14
+ bytelen = d.size
15
+ write(bytelen)
16
+ write("\t")
17
+ write(d)
18
+ write("\n")
19
+ end
20
+
21
+ def each_object_with_index
22
+ rewind
23
+ @numt.times { |i| yield(recover_tracker, i - 1) }
24
+ end
25
+
26
+ private
27
+
28
+ def recover_tracker
29
+ # Read everything upto the tab
30
+ demarshal_bytes = gets("\t").strip.to_i
31
+ Marshal.load(read(demarshal_bytes))
32
+ end
33
+ end
data/lib/tracksperanto.rb CHANGED
@@ -4,7 +4,7 @@ require 'tempfile'
4
4
 
5
5
  module Tracksperanto
6
6
  PATH = File.expand_path(File.dirname(__FILE__))
7
- VERSION = '1.9.8'
7
+ VERSION = '1.9.9'
8
8
 
9
9
  module Import; end
10
10
  module Export; end
@@ -83,6 +83,7 @@ end
83
83
  simple_export
84
84
  uv_coordinates
85
85
  flame_builder
86
+ accumulator
86
87
  ).each do | submodule |
87
88
  require File.join(Tracksperanto::PATH, "tracksperanto", submodule)
88
89
  end
data/test/helper.rb CHANGED
@@ -80,8 +80,7 @@ module ParabolicTracks
80
80
  def ensure_same_output(exporter_klass, reference_path, message = "The line should be identical")
81
81
  if ENV['OVERWRITE']
82
82
  File.open(reference_path, "w") do | out |
83
- x = exporter_klass.new(out)
84
- export_parabolics_with(x)
83
+ export_parabolics_with(exporter_klass.new(out))
85
84
  end
86
85
  end
87
86
 
@@ -15,8 +15,8 @@ class EqualizerImportTest < Test::Unit::TestCase
15
15
  parser = Tracksperanto::Import::Equalizer4.new
16
16
  parser.width = 1024
17
17
  parser.height = 512
18
-
19
18
  trackers = parser.parse(fixture)
19
+
20
20
  assert_equal 8, trackers.length
21
21
 
22
22
  first_t = trackers[0]
@@ -13,7 +13,6 @@ class Equalizer3ImportTest < Test::Unit::TestCase
13
13
  fixture = File.open(File.dirname(__FILE__) + '/samples/3de_v3/3de_export_v3.txt')
14
14
 
15
15
  parser = Tracksperanto::Import::Equalizer3.new
16
-
17
16
  trackers = parser.parse(fixture)
18
17
 
19
18
  assert_equal 2048, parser.width
@@ -13,9 +13,9 @@ class BoujouImportTest < Test::Unit::TestCase
13
13
  fixture = File.open(File.dirname(__FILE__) + '/samples/boujou_features_text/boujou_txt_export.txt')
14
14
 
15
15
  parser = Tracksperanto::Import::Boujou.new(:width => 2560, :height => 1200)
16
-
17
16
  trackers = parser.parse(fixture)
18
- assert_equal 20, trackers.length
17
+
18
+ assert_equal 21, trackers.length
19
19
 
20
20
  tracker1 = trackers[1]
21
21
 
@@ -1,5 +1,4 @@
1
1
  require File.dirname(__FILE__) + '/helper'
2
- require "benchmark"
3
2
 
4
3
  class FlameBuilderTest < Test::Unit::TestCase
5
4
  def setup
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tracksperanto
3
3
  version: !ruby/object:Gem::Version
4
- hash: 35
4
+ hash: 33
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
8
  - 9
9
- - 8
10
- version: 1.9.8
9
+ - 9
10
+ version: 1.9.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Julik Tarkhanov
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-11 00:00:00 +02:00
18
+ date: 2010-11-29 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -54,12 +54,12 @@ dependencies:
54
54
  requirements:
55
55
  - - ">="
56
56
  - !ruby/object:Gem::Version
57
- hash: 23
57
+ hash: 21
58
58
  segments:
59
59
  - 2
60
60
  - 6
61
- - 0
62
- version: 2.6.0
61
+ - 1
62
+ version: 2.6.1
63
63
  type: :development
64
64
  version_requirements: *id003
65
65
  description: Tracksperanto is a universal 2D-track translator between many apps.
@@ -135,6 +135,7 @@ files:
135
135
  - lib/tracksperanto/tracker.rb
136
136
  - lib/tracksperanto/uv_coordinates.rb
137
137
  - lib/tracksperanto/zip_tuples.rb
138
+ - lib/tracksperanto/accumulator.rb
138
139
  - test/export/README_EXPORT_TESTS.txt
139
140
  - test/export/samples/ref_Mayalive.txt
140
141
  - test/export/samples/ref_Mayalive_CustomAspect.txt