tracksperanto 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/Manifest.txt +37 -0
  2. data/README.txt +56 -0
  3. data/Rakefile +13 -0
  4. data/bin/tracksperanto +74 -0
  5. data/lib/export/base.rb +35 -0
  6. data/lib/export/flame_stabilizer.rb +50 -0
  7. data/lib/export/mux.rb +33 -0
  8. data/lib/export/pftrack.rb +30 -0
  9. data/lib/export/shake_text.rb +29 -0
  10. data/lib/export/syntheyes.rb +32 -0
  11. data/lib/import/base.rb +24 -0
  12. data/lib/import/flame_stabilizer.rb +34 -0
  13. data/lib/import/shake_script.rb +127 -0
  14. data/lib/import/shake_text.rb +29 -0
  15. data/lib/import/syntheyes.rb +32 -0
  16. data/lib/middleware/base.rb +28 -0
  17. data/lib/middleware/scaler.rb +24 -0
  18. data/lib/middleware/slipper.rb +12 -0
  19. data/lib/pipeline.rb +54 -0
  20. data/lib/tracksperanto.rb +131 -0
  21. data/test/.DS_Store +0 -0
  22. data/test/helper.rb +5 -0
  23. data/test/samples/.DS_Store +0 -0
  24. data/test/samples/flyover2DP_syntheyes.txt +12687 -0
  25. data/test/samples/megaTrack.action.3dtrack.stabilizer +29793 -0
  26. data/test/samples/one_shake_tracker.txt +49 -0
  27. data/test/samples/one_shake_tracker_from_first.txt +188 -0
  28. data/test/samples/shake_tracker_nodes.shk +921 -0
  29. data/test/samples/shake_tracker_nodes_to_syntheyes.txt +4091 -0
  30. data/test/samples/three_tracks_in_one_stabilizer.shk +320 -0
  31. data/test/samples/two_shake_trackers.txt +78 -0
  32. data/test/samples/two_tracks_in_one_tracker.shk +319 -0
  33. data/test/test_flame_block.rb +19 -0
  34. data/test/test_keyframe.rb +32 -0
  35. data/test/test_shake_export.rb +58 -0
  36. data/test/test_shake_script_import.rb +50 -0
  37. data/test/test_shake_text_import.rb +44 -0
  38. data/test/test_syntheyes_import.rb +25 -0
  39. metadata +111 -0
@@ -0,0 +1,19 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ #require File.dirname(__FILE__) + '/../lib/support/flame_block'
3
+
4
+ #class FlameBlockTest < Test::Unit::TestCase
5
+ # B = Tracksperanto::FlameBlock
6
+ # def test_default_attributes
7
+ # b = B.new
8
+ # assert_equal( [], b.attribute_keys)
9
+ # assert_equal( {}, b.attributes)
10
+ # end
11
+ #
12
+ # def test_set_camelcase
13
+ # b = B.new
14
+ # b["FooBar"] = 1
15
+ # assert_equal( {"FooBar" => 1}, b.attributes)
16
+ # assert_equal( ["FooBar"], b.attribute_keys)
17
+ # end
18
+ #
19
+ #end
@@ -0,0 +1,32 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class KeyframeTest < Test::Unit::TestCase
4
+ def test_supports_block_init
5
+ keyframe = Tracksperanto::Keyframe.new do |k|
6
+ k.frame = 0
7
+ k.abs_x = 10.3
8
+ k.abs_y = 12.5
9
+ end
10
+
11
+ assert_equal 0, keyframe.frame
12
+ assert_equal 10.3, keyframe.abs_x
13
+ assert_equal 12.5, keyframe.abs_y
14
+ end
15
+
16
+ def test_frame_translated_to_int
17
+ kf = Tracksperanto::Keyframe.new {|k| k.frame = '0' }
18
+ assert_equal 0, kf.frame
19
+ end
20
+
21
+ def test_residual_defaults_to_zero
22
+ kf = Tracksperanto::Keyframe.new
23
+ assert_in_delta 0.0, kf.residual, 0.01
24
+ end
25
+
26
+ def test_abs_x_abs_y_translated_to_float
27
+ kf = Tracksperanto::Keyframe.new {|k| k.abs_x = '123.45678'; k.abs_y = '321.45678' }
28
+ assert_kind_of Float, kf.abs_x
29
+ assert_kind_of Float, kf.abs_y
30
+ end
31
+
32
+ end
@@ -0,0 +1,58 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+ require 'stringio'
3
+
4
+ class ShakeTextExportTest < Test::Unit::TestCase
5
+ def setup
6
+ t1 = Tracksperanto::Tracker.new {|t| t.name = "Tracker_One" }
7
+
8
+ t1.keyframes << Tracksperanto::Keyframe.new do |f|
9
+ f.frame = 12
10
+ f.abs_x = 123
11
+ f.abs_y = 456
12
+ f.residual = 0
13
+ end
14
+
15
+ t1.keyframes << Tracksperanto::Keyframe.new do |f|
16
+ f.frame = 14
17
+ f.abs_x = 125
18
+ f.abs_y = 465
19
+ f.residual = 0.4
20
+ end
21
+
22
+ t2 = Tracksperanto::Tracker.new {|t| t.name = "Tracker_Two" }
23
+
24
+ t2.keyframes << Tracksperanto::Keyframe.new do |f|
25
+ f.frame = 0
26
+ f.abs_x = 406
27
+ f.abs_y = 268
28
+ f.residual = 0
29
+ end
30
+
31
+ t2.keyframes << Tracksperanto::Keyframe.new do |f|
32
+ f.frame = 1
33
+ f.abs_x = 402.45689987
34
+ f.abs_y = 245.89682
35
+ f.residual = 0.4
36
+ end
37
+
38
+ @trackers = [t1, t2]
39
+ end
40
+
41
+ def test_export
42
+ out_to = "/tmp/shakeTr_txt.txt"
43
+ puts "Outputting #{out_to} Shake sample text file, please verify"
44
+ io = File.open(out_to, "w")
45
+
46
+ x = Tracksperanto::Export::ShakeText.new(io)
47
+
48
+ x.start_export(720, 576)
49
+ @trackers.each do | t |
50
+ x.start_tracker_segment(t.name)
51
+ t.keyframes.each do | kf |
52
+ x.export_point(kf.frame, kf.abs_x, kf.abs_y, kf.residual)
53
+ end
54
+ end
55
+ x.end_export
56
+ io.close
57
+ end
58
+ end
@@ -0,0 +1,50 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class ShakeScriptImportTest < Test::Unit::TestCase
4
+ DELTA = 0.001
5
+
6
+ def test_parsing_many_tracker_noes_with_one_track_each
7
+ fixture = File.read(File.dirname(__FILE__) + '/samples/shake_tracker_nodes.shk')
8
+
9
+ trackers = Tracksperanto::Import::ShakeScript.new.parse(fixture)
10
+ assert_equal 50, trackers.length
11
+
12
+ t = trackers[0]
13
+ assert_equal "Tracker1", t.name
14
+
15
+ first_kf = t.keyframes[0]
16
+ assert_equal 0, first_kf.frame
17
+ assert_in_delta 886.212, first_kf.abs_y, DELTA
18
+ assert_in_delta 715.839, first_kf.abs_x, DELTA
19
+ assert_in_delta 0.0, first_kf.residual, DELTA
20
+
21
+ second_kf = t.keyframes[1]
22
+ assert_in_delta 0.00129, second_kf.residual, DELTA
23
+ end
24
+
25
+ def test_parsing_many_tracks_in_one_tracker_node
26
+ fixture = File.read(File.dirname(__FILE__) + '/samples/two_tracks_in_one_tracker.shk')
27
+
28
+ trackers = Tracksperanto::Import::ShakeScript.new.parse(fixture)
29
+ assert_equal 2, trackers.length
30
+
31
+ t = trackers[0]
32
+ assert_equal "Tracker1", t.name
33
+
34
+ first_kf = t.keyframes[0]
35
+ assert_equal 0, first_kf.frame
36
+ assert_in_delta 886.212, first_kf.abs_y, DELTA
37
+ assert_in_delta 715.839, first_kf.abs_x, DELTA
38
+ assert_in_delta 0.0, first_kf.residual, DELTA
39
+
40
+ second_kf = t.keyframes[1]
41
+ assert_in_delta 0.00129, second_kf.residual, DELTA
42
+ end
43
+
44
+ def test_parsing_many_tracks_in_one_stabilizer_node
45
+ fixture = File.read(File.dirname(__FILE__) + '/samples/three_tracks_in_one_stabilizer.shk')
46
+
47
+ trackers = Tracksperanto::Import::ShakeScript.new.parse(fixture)
48
+ assert_equal 3, trackers.length
49
+ end
50
+ end
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class ShakeTextImportTest < Test::Unit::TestCase
4
+ DELTA = 0.000001
5
+ def test_parsing
6
+ fixture = File.read(File.dirname(__FILE__) + '/samples/one_shake_tracker.txt')
7
+ trackers = Tracksperanto::Import::ShakeText.new.parse(fixture)
8
+
9
+ assert_kind_of Enumerable, trackers
10
+ assert_equal 1, trackers.length
11
+
12
+ t = trackers[0]
13
+
14
+ assert_kind_of Tracksperanto::Tracker, t
15
+ assert_equal 46, t.keyframes.length
16
+ assert_equal "track1", t.name
17
+
18
+ second_kf = t.keyframes[1]
19
+ assert_in_delta 121, second_kf.frame, DELTA
20
+ assert_in_delta 373.746, second_kf.abs_x, DELTA
21
+ assert_in_delta 984.564, second_kf.abs_y, DELTA
22
+ assert_in_delta 0.002, second_kf.residual, DELTA
23
+ end
24
+
25
+ def test_parsing_two_trackers
26
+ fixture = File.read(File.dirname(__FILE__) + '/samples/two_shake_trackers.txt')
27
+ trackers = Tracksperanto::Import::ShakeText.new.parse(fixture)
28
+
29
+ assert_kind_of Enumerable, trackers
30
+ assert_equal 2, trackers.length
31
+
32
+ t = trackers[0]
33
+
34
+ assert_equal "track1", t.name
35
+ assert_kind_of Tracksperanto::Tracker, t
36
+ assert_equal 6, t.keyframes.length
37
+
38
+ second_kf = t.keyframes[1]
39
+ assert_in_delta 111, second_kf.frame, DELTA
40
+
41
+ t2 = trackers[-1]
42
+ assert_equal "track2", t2.name
43
+ end
44
+ end
@@ -0,0 +1,25 @@
1
+ require File.dirname(__FILE__) + '/helper'
2
+
3
+ class SyntheyesImportTest < Test::Unit::TestCase
4
+ DELTA = 0.9 # our SynthEyes sample is smoewhat inaccurate :-P
5
+
6
+ def test_parsing_from_importable
7
+ fixture = File.read(File.dirname(__FILE__) + '/samples/shake_tracker_nodes_to_syntheyes.txt')
8
+
9
+ parser = Tracksperanto::Import::Syntheyes.new
10
+ parser.width = 2560
11
+ parser.height = 1080
12
+
13
+ trackers = parser.parse(fixture)
14
+ assert_equal 50, trackers.length
15
+
16
+ first_kf = trackers[0].keyframes[0]
17
+
18
+ assert_equal "Tracker1", trackers[0].name
19
+
20
+ assert_equal 0, first_kf.frame
21
+ assert_in_delta 715.839, first_kf.abs_x, DELTA
22
+ assert_in_delta 886.212, first_kf.abs_y, DELTA
23
+ assert_in_delta 30.0, first_kf.residual, DELTA
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: tracksperanto
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Julik Tarkhanov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-08-31 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.8.3
24
+ version:
25
+ description: "Tracksperanto is a universal 2D-track translator between many apps. Import support: * Shake script (one tracker node per tracker) * Shake tracker node export (textfile with many tracks per file), also exported by Boujou and others * PFTrack 2dt files * Syntheyes 2D tracking data exports (UV coordinates) Export support: * Shake text file (many trackers per file), also accepted by Boujou * PFTrack 2dt file (with residuals) * Syntheyes 2D tracking data import (UV coordinates) The main way to use Tracksperanto is to use the supplied \"tracksperanto\" binary, like so: tracksperanto -f ShakeScript -w 1920 -h 1080 /Films/Blockbuster/Shots/001/script.shk ShakeScript is the name of the translator that will be used to read the file (many apps export tracks as .txt files so there is no way for us to autodetect them all). -w and -h stand for Width and Height and define the size of your comp (different tracking apps use different coordinate systems and we need to know the size of the comp to properly convert these). You also have additional options like -xs, -ys and --slip - consult the usage info for the tracksperanto binary. The converted files will be saved in the same directory as the source, if resulting converted files already exist ++they will be overwritten without warning++."
26
+ email:
27
+ - me@julik.nl
28
+ executables:
29
+ - tracksperanto
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - Manifest.txt
34
+ - README.txt
35
+ - test/samples/flyover2DP_syntheyes.txt
36
+ - test/samples/one_shake_tracker.txt
37
+ - test/samples/one_shake_tracker_from_first.txt
38
+ - test/samples/shake_tracker_nodes_to_syntheyes.txt
39
+ - test/samples/two_shake_trackers.txt
40
+ files:
41
+ - Manifest.txt
42
+ - README.txt
43
+ - Rakefile
44
+ - bin/tracksperanto
45
+ - lib/export/base.rb
46
+ - lib/export/flame_stabilizer.rb
47
+ - lib/export/mux.rb
48
+ - lib/export/pftrack.rb
49
+ - lib/export/shake_text.rb
50
+ - lib/export/syntheyes.rb
51
+ - lib/import/base.rb
52
+ - lib/import/flame_stabilizer.rb
53
+ - lib/import/shake_script.rb
54
+ - lib/import/shake_text.rb
55
+ - lib/import/syntheyes.rb
56
+ - lib/middleware/base.rb
57
+ - lib/middleware/scaler.rb
58
+ - lib/middleware/slipper.rb
59
+ - lib/pipeline.rb
60
+ - lib/tracksperanto.rb
61
+ - test/.DS_Store
62
+ - test/helper.rb
63
+ - test/samples/.DS_Store
64
+ - test/samples/flyover2DP_syntheyes.txt
65
+ - test/samples/megaTrack.action.3dtrack.stabilizer
66
+ - test/samples/one_shake_tracker.txt
67
+ - test/samples/one_shake_tracker_from_first.txt
68
+ - test/samples/shake_tracker_nodes.shk
69
+ - test/samples/shake_tracker_nodes_to_syntheyes.txt
70
+ - test/samples/three_tracks_in_one_stabilizer.shk
71
+ - test/samples/two_shake_trackers.txt
72
+ - test/samples/two_tracks_in_one_tracker.shk
73
+ - test/test_keyframe.rb
74
+ - test/test_shake_export.rb
75
+ - test/test_shake_script_import.rb
76
+ - test/test_shake_text_import.rb
77
+ - test/test_syntheyes_import.rb
78
+ has_rdoc: true
79
+ homepage: http://guerilla-di.org/tracksperanto
80
+ post_install_message:
81
+ rdoc_options:
82
+ - --main
83
+ - README.txt
84
+ require_paths:
85
+ - lib
86
+ required_ruby_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: "0"
91
+ version:
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: "0"
97
+ version:
98
+ requirements: []
99
+
100
+ rubyforge_project: guerilla-di
101
+ rubygems_version: 1.3.1
102
+ signing_key:
103
+ specification_version: 2
104
+ summary: Tracksperanto is a universal 2D-track translator between many apps
105
+ test_files:
106
+ - test/test_flame_block.rb
107
+ - test/test_keyframe.rb
108
+ - test/test_shake_export.rb
109
+ - test/test_shake_script_import.rb
110
+ - test/test_shake_text_import.rb
111
+ - test/test_syntheyes_import.rb