tracksperanto 2.2.2 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.
data/DEVELOPER_DOCS.rdoc CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  You can easily write a Tracksperanto import module - refer to Tracksperanto::Import::Base
6
6
  docs. Your importer will be configured with width and height of the comp that it is importing, and will get an IO
7
- object with the file that you are processing. The parse method should then return an array of Tracksperanto::Tracker objects which
8
- are themselves arrays of Tracksperanto::Keyframe objects.
7
+ object with the file that you are processing. You should then yield parsed trackers within the each method (tracker objects should
8
+ be Tracksperanto::Tracker objects or compatibles)
9
9
 
10
10
  === Exporting your own formats
11
11
 
data/History.txt CHANGED
@@ -1,3 +1,15 @@
1
+ === 2.2.4 / 2011-04-04
2
+
3
+ * Properly deal with negative frames happening in Shake scripts sometimes. We will now recognize a script starting at negative
4
+ frames and "bump" it's frames in curves so that everything neatly starts at frame 0. Granted this does not give us the same frame range
5
+ but most apps wil go bonkers anyway if we send them negative frame numbers.
6
+
7
+ === 2.2.3 / 2011-04-03
8
+
9
+ * Prevent zero-length trackers (trackers having no position information) from being accumulated during import.
10
+ This had adverse effects on export modules that could not export trackers containing no information. As a sidenote we
11
+ will write down in the doco that an export module should not expect empty trackers with no keyframes to be sent
12
+
1
13
  === 2.2.2 / 2011-04-03
2
14
 
3
15
  * The last change to PFMatchit exporter had adverse effects on pftrack files, now fixed.
@@ -13,8 +25,8 @@
13
25
 
14
26
  * Improve documentation substantially
15
27
  * Changed the Import::Base interface yo use enumeration instead of @receiver.
16
- Upside: This allows us to convert importers to an array of trackers and other niceties.
17
- Downside: stream_parse will be deprecated. It is however still available for backwards compatibility
28
+ Upside: This allows us to convert importers to an array of trackers and other niceties.
29
+ Downside: stream_parse will be deprecated. It is however still available for backwards compatibility
18
30
 
19
31
  === 2.1.1 / 2011-02-14
20
32
 
data/Manifest.txt CHANGED
@@ -109,7 +109,9 @@ test/import/samples/nuke/tracker_with_repeating_gaps.nk
109
109
  test/import/samples/pfmatchit/pfmatchit_example.2dt
110
110
  test/import/samples/pftrack4/sourcefile_pftrack.2dt
111
111
  test/import/samples/pftrack5/apft.2dt
112
+ test/import/samples/pftrack5/empty_trackers.2dt
112
113
  test/import/samples/pftrack5/garage.2dt
114
+ test/import/samples/shake_script/designated_global_range_starting_at_negative_frame.shk
113
115
  test/import/samples/shake_script/four_tracks_in_one_matchmove.shk
114
116
  test/import/samples/shake_script/four_tracks_in_one_stabilizer.shk
115
117
  test/import/samples/shake_script/from_matchmover.shk
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ begin
16
16
  p.extra_dev_deps = {"flexmock" => ">=0"}
17
17
  p.rubyforge_name = 'guerilla-di'
18
18
  p.developer('Julik Tarkhanov', 'me@julik.nl')
19
- p.clean_globs = %w( **/.DS_Store coverage.info **/*.rbc .idea)
19
+ p.clean_globs = %w( **/.DS_Store coverage.info **/*.rbc .idea .yardoc)
20
20
  end
21
21
  rescue LoadError
22
22
  $stderr.puts "Meta-operations on this package require Hoe"
data/lib/export/base.rb CHANGED
@@ -21,6 +21,7 @@
21
21
  # exporter.end_export
22
22
  # end
23
23
  #
24
+ # By contract export_point will be called at least once for each tracker being exported (no empty trackers will be sent)
24
25
  class Tracksperanto::Export::Base
25
26
  include Tracksperanto::ConstName
26
27
  include Tracksperanto::SimpleExport
@@ -14,10 +14,6 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
14
14
  "Flame .stabilizer file"
15
15
  end
16
16
 
17
- class Key
18
- attr_accessor :at, :value, :extrap, :interp, :left_tangent, :right_tangent
19
- end
20
-
21
17
  class ChannelBlock < Array
22
18
  include ::Tracksperanto::Casts
23
19
  cast_to_string :name
@@ -78,10 +78,10 @@ module Tracksperanto::ShakeGrammar
78
78
  end
79
79
  end
80
80
 
81
- INT_ATOM = /^(\d+)$/
81
+ INT_ATOM = /^(-?\d+)$/
82
82
  FLOAT_ATOM = /^([\-\d\.]+)$/
83
83
  STR_ATOM = /^\"/
84
- AT_FRAME = /^@(\d+)/
84
+ AT_FRAME = /^@(-?\d+)/
85
85
 
86
86
  # Grab the minimum atomic value
87
87
  def consume_atom!
@@ -12,16 +12,33 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
12
12
  end
13
13
 
14
14
  def each
15
- progress_proc = lambda{|msg| report_progress(msg) }
16
- TrackExtractor.new(@io, [Proc.new, progress_proc])
15
+ s = Sentinel.new
16
+ s.progress_proc = method(:report_progress)
17
+ s.tracker_proc = Proc.new
18
+ TrackExtractor.new(@io, s)
17
19
  end
18
20
 
19
21
  private
20
22
 
23
+ #:nodoc:
24
+
25
+ class Sentinel
26
+ attr_accessor :start_frame, :tracker_proc, :progress_proc
27
+ def start_frame
28
+ @start_frame.to_i
29
+ end
30
+ end
31
+
21
32
  # Extractor. Here we define copies of Shake's standard node creation functions.
22
33
  class TrackExtractor < Tracksperanto::ShakeGrammar::Catcher
23
34
  include Tracksperanto::ZipTuples
24
35
 
36
+ # SetTimeRange("-5-15") // sets time range of comp
37
+ # We use it to avoid producing keyframes which start at negative frames
38
+ def settimerange(str)
39
+ sentinel.start_frame = str.to_i if str.to_i < 0
40
+ end
41
+
25
42
  # Normally, we wouldn't need to look for the variable name from inside of the funcall. However,
26
43
  # in this case we DO want to take this shortcut so we know how the tracker node is called
27
44
  def push(atom)
@@ -31,7 +48,8 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
31
48
  trackers = atom[2][1][1..-1]
32
49
  trackers.map do | tracker |
33
50
  tracker.name = [node_name, tracker.name].join("_")
34
- sentinel[0].call(tracker)
51
+ # THIS IS THE MOST IMPORTANT THINGO
52
+ sentinel.tracker_proc.call(tracker)
35
53
  end
36
54
  end
37
55
 
@@ -43,7 +61,8 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
43
61
  # We put the frame number at the beginning since it works witih oru tuple zipper
44
62
  def linear(extrapolation_type, *keyframes)
45
63
  report_progress("Translating Linear animation")
46
- keyframes.map { |kf| [kf.at, kf.value] }
64
+ remap_keyframes_against_negative_at!(keyframes)
65
+ keyframes.map { |kf| [kf.at , kf.value] }
47
66
  end
48
67
  alias_method :nspline, :linear
49
68
  alias_method :jspline, :linear
@@ -54,9 +73,16 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
54
73
  # tangent positions (which we discard)
55
74
  def hermite(extrapolation_type, *keyframes)
56
75
  report_progress("Translating Hermite curve, removing tangents")
76
+ remap_keyframes_against_negative_at!(keyframes)
57
77
  keyframes.map{ |kf| [kf.at, kf.value[0]] }
58
78
  end
59
79
 
80
+ def remap_keyframes_against_negative_at!(kfs)
81
+ frame_start_of_script = sentinel.start_frame
82
+ kfs.each{|k| k.at = (k.at - frame_start_of_script) }
83
+ end
84
+ private :remap_keyframes_against_negative_at!
85
+
60
86
  # image Tracker(
61
87
  # image In,
62
88
  # const char * trackRange,
@@ -199,7 +225,7 @@ class Tracksperanto::Import::ShakeScript < Tracksperanto::Import::Base
199
225
  private
200
226
 
201
227
  def report_progress(with_message)
202
- sentinel[1].call(with_message) if sentinel[1]
228
+ sentinel.progress_proc.call(with_message)
203
229
  end
204
230
 
205
231
  def collect_trackers_from(array)
@@ -4,7 +4,7 @@ class Tracksperanto::Middleware::Shift < Tracksperanto::Middleware::Base
4
4
  cast_to_float :x_shift, :y_shift
5
5
 
6
6
  def export_point(frame, float_x, float_y, float_residual)
7
- super(frame, float_x + (@x_shift || 0), float_y + (@y_shift || 0), float_residual)
7
+ super(frame, float_x + @x_shift.to_f, float_y + @y_shift.to_f, float_residual)
8
8
  end
9
9
 
10
10
  end
data/lib/pipeline/base.rb CHANGED
@@ -16,7 +16,6 @@ module Tracksperanto::Pipeline
16
16
  def message; "Could not recover any non-empty trackers from this file. Wrong import format maybe?"; end
17
17
  end
18
18
 
19
-
20
19
  # The base pipeline is the whole process of track conversion from start to finish. The pipeline object organizes the import formats, scans them,
21
20
  # applies the middlewares. Here's how a calling sequence for a pipeline looks like:
22
21
  #
@@ -149,7 +148,7 @@ module Tracksperanto::Pipeline
149
148
  importer.stream_parse(io_with_progress)
150
149
  else
151
150
  importer.io = io_with_progress
152
- importer.each {|t| @accumulator.push(t) }
151
+ importer.each {|t| @accumulator.push(t) unless t.empty? }
153
152
  end
154
153
 
155
154
  report_progress(percent_complete = 50.0, "Validating #{@accumulator.size} imported trackers")
data/lib/tracksperanto.rb CHANGED
@@ -1,11 +1,10 @@
1
1
  require 'stringio'
2
2
  require 'delegate'
3
- require 'forwardable'
4
3
  require 'tempfile'
5
4
 
6
5
  module Tracksperanto
7
6
  PATH = File.expand_path(File.dirname(__FILE__))
8
- VERSION = '2.2.2'
7
+ VERSION = '2.2.4'
9
8
 
10
9
  module Import; end
11
10
  module Export; end
@@ -0,0 +1,30 @@
1
+ # 2D feature tracks generated by PFTrack 5.0r4-90106
2
+ #
3
+ # format:
4
+ # "name"
5
+ # "camera"
6
+ # <number of frames>
7
+ # <frame number> <x pixel> <y pixel> <residual>
8
+ #
9
+
10
+ "Feature2"
11
+ "Primary"
12
+ 0
13
+
14
+ "Feature3"
15
+ "Primary"
16
+ 10
17
+ 9095 615.471 403.957 0.000
18
+ 9105 643.794 405.318 0.000
19
+ 9107 644.339 405.863 0.000
20
+ 9115 632.084 424.110 0.000
21
+ 9121 627.684 438.722 0.000
22
+ 9125 709.070 452.946 0.000
23
+ 9128 726.041 472.858 0.000
24
+ 9131 668.577 480.211 0.000
25
+ 9135 595.863 470.952 0.000
26
+ 9138 527.778 467.956 0.000
27
+
28
+ "Feature4"
29
+ "Primary"
30
+ 0