tracksperanto 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +37 -0
- data/README.txt +56 -0
- data/Rakefile +13 -0
- data/bin/tracksperanto +74 -0
- data/lib/export/base.rb +35 -0
- data/lib/export/flame_stabilizer.rb +50 -0
- data/lib/export/mux.rb +33 -0
- data/lib/export/pftrack.rb +30 -0
- data/lib/export/shake_text.rb +29 -0
- data/lib/export/syntheyes.rb +32 -0
- data/lib/import/base.rb +24 -0
- data/lib/import/flame_stabilizer.rb +34 -0
- data/lib/import/shake_script.rb +127 -0
- data/lib/import/shake_text.rb +29 -0
- data/lib/import/syntheyes.rb +32 -0
- data/lib/middleware/base.rb +28 -0
- data/lib/middleware/scaler.rb +24 -0
- data/lib/middleware/slipper.rb +12 -0
- data/lib/pipeline.rb +54 -0
- data/lib/tracksperanto.rb +131 -0
- data/test/.DS_Store +0 -0
- data/test/helper.rb +5 -0
- data/test/samples/.DS_Store +0 -0
- data/test/samples/flyover2DP_syntheyes.txt +12687 -0
- data/test/samples/megaTrack.action.3dtrack.stabilizer +29793 -0
- data/test/samples/one_shake_tracker.txt +49 -0
- data/test/samples/one_shake_tracker_from_first.txt +188 -0
- data/test/samples/shake_tracker_nodes.shk +921 -0
- data/test/samples/shake_tracker_nodes_to_syntheyes.txt +4091 -0
- data/test/samples/three_tracks_in_one_stabilizer.shk +320 -0
- data/test/samples/two_shake_trackers.txt +78 -0
- data/test/samples/two_tracks_in_one_tracker.shk +319 -0
- data/test/test_flame_block.rb +19 -0
- data/test/test_keyframe.rb +32 -0
- data/test/test_shake_export.rb +58 -0
- data/test/test_shake_script_import.rb +50 -0
- data/test/test_shake_text_import.rb +44 -0
- data/test/test_syntheyes_import.rb +25 -0
- 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
|