tracksperanto 2.6.1 → 2.6.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +1 -0
- data/bin/tracksperanto +9 -1
- data/lib/import/flame_stabilizer.rb +20 -19
- data/lib/import/shake_grammar/lexer.rb +3 -3
- data/lib/pipeline/base.rb +13 -1
- data/lib/tracksperanto.rb +1 -1
- data/test/fixtures/processing_log.txt +50 -0
- data/test/import/test_flame_import.rb +1 -1
- data/test/import/test_shake_lexer.rb +2 -2
- data/test/test_cli.rb +6 -0
- data/test/test_pipeline.rb +14 -1
- metadata +3 -2
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
@@ -94,6 +94,7 @@ test/export/test_pftrack5_export.rb
|
|
94
94
|
test/export/test_pftrack_export.rb
|
95
95
|
test/export/test_shake_export.rb
|
96
96
|
test/export/test_syntheyes_export.rb
|
97
|
+
test/fixtures/processing_log.txt
|
97
98
|
test/helper.rb
|
98
99
|
test/import/samples/3de_v3/3de_export_v3.txt
|
99
100
|
test/import/samples/3de_v4/3de_export_cube.txt
|
data/bin/tracksperanto
CHANGED
@@ -94,6 +94,7 @@ op.on("--version", "Show the version and exit") do |v|
|
|
94
94
|
UpdateHints.version_check("tracksperanto", Tracksperanto::VERSION, STDOUT)
|
95
95
|
exit(0)
|
96
96
|
end
|
97
|
+
op.on("--trace", "Output LOTS of info during conversion") { $debug = true }
|
97
98
|
|
98
99
|
begin
|
99
100
|
op.parse!
|
@@ -114,7 +115,14 @@ unless File.exist?(input_file)
|
|
114
115
|
end
|
115
116
|
|
116
117
|
pbar = ProgressBar.new("Converting", 100, $stdout)
|
117
|
-
progress = lambda
|
118
|
+
progress = lambda do |percent,message|
|
119
|
+
pbar.set(percent)
|
120
|
+
if $debug
|
121
|
+
STDOUT.puts("[%d -> %s]" % [percent, message])
|
122
|
+
STDOUT.flush
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
118
126
|
begin
|
119
127
|
pipe = Tracksperanto::Pipeline::Base.new(:progress_block => progress, :middleware_tuples => $middlewares)
|
120
128
|
pipe.exporters = [Tracksperanto.get_exporter(writer_class_name)] if writer_class_name
|
@@ -23,8 +23,6 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
|
|
23
23
|
|
24
24
|
report_progress("Assembling tracker curves from channels")
|
25
25
|
scavenge_trackers_from_channels(channels, names) {|t| yield(t) }
|
26
|
-
ensure
|
27
|
-
channels.clear
|
28
26
|
end
|
29
27
|
|
30
28
|
private
|
@@ -46,28 +44,31 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
|
|
46
44
|
end
|
47
45
|
|
48
46
|
end
|
49
|
-
|
50
|
-
def extract_channels_from_stream(io)
|
51
|
-
channels = FlameChannelParser.parse(io)
|
52
|
-
[channels, channels.map{|c| c.path }]
|
53
|
-
end
|
54
47
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
48
|
+
# We subclass the standard parser for a couple of reasons - we want to only parse the needed channels
|
49
|
+
# AND we want to provide progress reports
|
50
|
+
class StabilizerParser < FlameChannelParser::Parser
|
51
|
+
USEFUL_CHANNELS = %w( /shift/x /shift/y /ref/x /ref/y ).map(&Regexp.method(:new))
|
52
|
+
|
53
|
+
# This method tells the importer whether a channel that has been found in the source
|
54
|
+
# setup is needed. If that method returns ++false++ the channel will be discarded and not
|
55
|
+
# kept in memory. Should you need to write a module that scavenges other Flame animation channels
|
56
|
+
# inherit from this class and rewrite this method to either return +true+ always (then all the channels
|
57
|
+
# will be recovered) or to return +true+ only for channels that you actually need.
|
58
|
+
def channel_is_useful?(channel_name)
|
59
|
+
USEFUL_CHANNELS.any?{|e| channel_name =~ e }
|
60
|
+
end
|
64
61
|
end
|
65
62
|
|
66
|
-
|
63
|
+
def extract_channels_from_stream(io)
|
64
|
+
parser = StabilizerParser.new(&method(:report_progress))
|
65
|
+
channels = parser.parse(io)
|
66
|
+
[channels, channels.map{|c| c.path }]
|
67
|
+
end
|
67
68
|
|
68
69
|
def scavenge_trackers_from_channels(channels, names)
|
69
70
|
channels.each do |c|
|
70
|
-
next unless c.name =~
|
71
|
+
next unless c.name =~ /\/ref\/x/
|
71
72
|
|
72
73
|
report_progress("Detected reference channel #{c.name}")
|
73
74
|
|
@@ -87,7 +88,7 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
|
|
87
88
|
|
88
89
|
# This takes a LONG time when we have alot of channels, we need a precache of
|
89
90
|
# some sort to do this
|
90
|
-
ref_idx = names.index("#{t.name}
|
91
|
+
ref_idx = names.index("#{t.name}/ref/y")
|
91
92
|
shift_x_idx = names.index("#{t.name}/shift/x")
|
92
93
|
shift_y_idx = names.index("#{t.name}/shift/y")
|
93
94
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module Tracksperanto::ShakeGrammar
|
2
|
-
class
|
2
|
+
class WrongInputError < RuntimeError; end
|
3
3
|
|
4
4
|
# Since Shake uses a C-like language for it's scripts we rig up a very sloppy
|
5
5
|
# but concise C-like lexer to cope
|
@@ -41,11 +41,11 @@ module Tracksperanto::ShakeGrammar
|
|
41
41
|
c = @io.read(1)
|
42
42
|
|
43
43
|
if @buf.length > MAX_BUFFER_SIZE # Wrong format and the buffer is filled up, bail
|
44
|
-
raise
|
44
|
+
raise WrongInputError, "Atom buffer overflow at #{MAX_BUFFER_SIZE} bytes, this is definitely not a Shake script"
|
45
45
|
end
|
46
46
|
|
47
47
|
if @stack_depth > MAX_STACK_DEPTH # Wrong format - parentheses overload
|
48
|
-
raise
|
48
|
+
raise WrongInputError, "Stack overflow at level #{MAX_STACK_DEPTH}, this is probably a LISP program uploaded by accident"
|
49
49
|
end
|
50
50
|
|
51
51
|
if c == '/' && (@buf[-1].chr rescue nil) == '/' # Comment start
|
data/lib/pipeline/base.rb
CHANGED
@@ -132,21 +132,33 @@ module Tracksperanto::Pipeline
|
|
132
132
|
# status message that you can pass back to the UI
|
133
133
|
def run_export(tracker_data_io, importer, exporter)
|
134
134
|
points, keyframes, percent_complete = 0, 0, 0.0
|
135
|
+
last_reported_percentage = 0.0
|
135
136
|
|
136
137
|
report_progress(percent_complete, "Starting the parser")
|
138
|
+
progress_lambda = lambda do | m |
|
139
|
+
last_reported_percentage = percent_complete
|
140
|
+
report_progress(percent_complete, m)
|
141
|
+
end
|
137
142
|
|
138
143
|
# Report progress from the parser
|
139
|
-
importer.progress_block =
|
144
|
+
importer.progress_block = progress_lambda
|
140
145
|
|
141
146
|
# Wrap the input in a progressive IO, setup a lambda that will spy on the reader and
|
142
147
|
# update the percentage. We will only broadcast messages that come from the parser
|
143
148
|
# though (complementing it with a percentage)
|
144
149
|
io_with_progress = Tracksperanto::ProgressiveIO.new(tracker_data_io) do | offset, of_total |
|
145
150
|
percent_complete = (50.0 / of_total) * offset
|
151
|
+
|
152
|
+
# Some importers do not signal where they are and do not send nice reports. The way we can help that in the interim
|
153
|
+
# would be just to indicate where we are in the input, but outside of the exporter. We do not want to flood
|
154
|
+
# the logs though so what we WILL do instead is report some progress going on every 2-3 percent
|
155
|
+
progress_lambda.call("Parsing the file") if (percent_complete - last_reported_percentage) > 3
|
146
156
|
end
|
157
|
+
|
147
158
|
@ios.push(io_with_progress)
|
148
159
|
|
149
160
|
@accumulator = Tracksperanto::Accumulator.new
|
161
|
+
|
150
162
|
begin
|
151
163
|
|
152
164
|
# OBSOLETE - for this version we are going to permit it.
|
data/lib/tracksperanto.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
0 -> Starting the parser
|
2
|
+
0 -> Extracting setup size
|
3
|
+
0 -> Extracting all animation channels
|
4
|
+
3 -> Parsing the file
|
5
|
+
6 -> Parsing the file
|
6
|
+
9 -> Parsing the file
|
7
|
+
13 -> Parsing the file
|
8
|
+
16 -> Parsing the file
|
9
|
+
19 -> Parsing the file
|
10
|
+
22 -> Parsing the file
|
11
|
+
25 -> Parsing the file
|
12
|
+
28 -> Parsing the file
|
13
|
+
31 -> Parsing the file
|
14
|
+
34 -> Parsing the file
|
15
|
+
37 -> Parsing the file
|
16
|
+
40 -> Parsing the file
|
17
|
+
43 -> Parsing the file
|
18
|
+
46 -> Parsing the file
|
19
|
+
49 -> Parsing the file
|
20
|
+
50 -> Assembling tracker curves from channels
|
21
|
+
50 -> Detected reference channel tracker1/ref/x
|
22
|
+
50 -> Extracting tracker tracker1
|
23
|
+
50 -> Detecting base value
|
24
|
+
50 -> Extracting keyframe 2 of tracker1
|
25
|
+
50 -> Extracting keyframe 3 of tracker1
|
26
|
+
50 -> Extracting keyframe 4 of tracker1
|
27
|
+
50 -> Detected reference channel tracker2/ref/x
|
28
|
+
50 -> Extracting tracker tracker2
|
29
|
+
50 -> Detecting base value
|
30
|
+
50 -> Extracting keyframe 2 of tracker2
|
31
|
+
50 -> Extracting keyframe 3 of tracker2
|
32
|
+
50 -> Extracting keyframe 4 of tracker2
|
33
|
+
50 -> Detected reference channel tracker3/ref/x
|
34
|
+
50 -> Extracting tracker tracker3
|
35
|
+
50 -> Detecting base value
|
36
|
+
50 -> Extracting keyframe 2 of tracker3
|
37
|
+
50 -> Extracting keyframe 3 of tracker3
|
38
|
+
50 -> Extracting keyframe 4 of tracker3
|
39
|
+
50 -> Validating 3 imported trackers
|
40
|
+
50 -> Starting export
|
41
|
+
55 -> Writing keyframe 1 of "tracker1", 3 trackers to go
|
42
|
+
61 -> Writing keyframe 2 of "tracker1", 3 trackers to go
|
43
|
+
66 -> Writing keyframe 3 of "tracker1", 3 trackers to go
|
44
|
+
72 -> Writing keyframe 1 of "tracker2", 2 trackers to go
|
45
|
+
77 -> Writing keyframe 2 of "tracker2", 2 trackers to go
|
46
|
+
83 -> Writing keyframe 3 of "tracker2", 2 trackers to go
|
47
|
+
88 -> Writing keyframe 1 of "tracker3", 1 trackers to go
|
48
|
+
94 -> Writing keyframe 2 of "tracker3", 1 trackers to go
|
49
|
+
100 -> Writing keyframe 3 of "tracker3", 1 trackers to go
|
50
|
+
100 -> Wrote 3 points and 9 keyframes
|
@@ -87,7 +87,7 @@ class FlameImportTest < Test::Unit::TestCase
|
|
87
87
|
end
|
88
88
|
|
89
89
|
# a failing setup from flame 2012
|
90
|
-
def
|
90
|
+
def test_from_flame2012_with_empty_trackers
|
91
91
|
fixture = File.open(File.dirname(__FILE__) + '/samples/flame_stabilizer/flame_2012_another.stabilizer')
|
92
92
|
trackers = Tracksperanto::Import::FlameStabilizer.new(:io => fixture).to_a
|
93
93
|
assert_equal 1, trackers.length
|
@@ -7,14 +7,14 @@ class ShakeLexerTest < Test::Unit::TestCase
|
|
7
7
|
WRONG = File.dirname(__FILE__) + "/samples/flame_stabilizer/hugeFlameSetup.stabilizer"
|
8
8
|
|
9
9
|
def test_raises_wrong_input_when_buffer_gets_too_large
|
10
|
-
assert_raise(Tracksperanto::ShakeGrammar::
|
10
|
+
assert_raise(Tracksperanto::ShakeGrammar::WrongInputError) do
|
11
11
|
parse(File.open(WRONG), L)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
def test_raises_wrong_input_on_stack_size
|
16
16
|
huge_stack = "(" * 345
|
17
|
-
assert_raise(Tracksperanto::ShakeGrammar::
|
17
|
+
assert_raise(Tracksperanto::ShakeGrammar::WrongInputError) do
|
18
18
|
parse(StringIO.new(huge_stack), L)
|
19
19
|
end
|
20
20
|
end
|
data/test/test_cli.rb
CHANGED
@@ -65,6 +65,12 @@ class CliTest < Test::Unit::TestCase
|
|
65
65
|
assert_same_set fs, Dir.entries(TEMP_DIR)
|
66
66
|
end
|
67
67
|
|
68
|
+
# TODO: This currently hangs in testing
|
69
|
+
# def test_cli_with_trace_option
|
70
|
+
# FileUtils.cp(File.dirname(__FILE__) + "/import/samples/flame_stabilizer/fromCombustion_fromMidClip_wSnap.stabilizer", TEMP_DIR + "/flm.stabilizer")
|
71
|
+
# status, o, e = cli("#{BIN_P} --trace #{TEMP_DIR}/flm.stabilizer")
|
72
|
+
# end
|
73
|
+
|
68
74
|
def test_cli_reformat
|
69
75
|
FileUtils.cp(File.dirname(__FILE__) + "/import/samples/flame_stabilizer/fromCombustion_fromMidClip_wSnap.stabilizer", TEMP_DIR + "/flm.stabilizer")
|
70
76
|
cli("--reformat-x 1204 --reformat-y 340 --only flamestabilizer #{TEMP_DIR}/flm.stabilizer")
|
data/test/test_pipeline.rb
CHANGED
@@ -35,7 +35,7 @@ class PipelineTest < Test::Unit::TestCase
|
|
35
35
|
assert_equal [:a, :b], pipeline.middleware_tuples
|
36
36
|
end
|
37
37
|
|
38
|
-
def
|
38
|
+
def test_run_with_autodetected_importer_and_size_without_progress_block
|
39
39
|
create_stabilizer_file
|
40
40
|
pipeline = Tracksperanto::Pipeline::Base.new
|
41
41
|
assert_nothing_raised { pipeline.run(@stabilizer) }
|
@@ -43,6 +43,19 @@ class PipelineTest < Test::Unit::TestCase
|
|
43
43
|
assert_equal 9, pipeline.converted_keyframes, "Should report conversion of 9 keyframes"
|
44
44
|
end
|
45
45
|
|
46
|
+
def test_run_with_autodetected_importer_and_size_with_progress_block
|
47
|
+
create_stabilizer_file
|
48
|
+
processing_log = ""
|
49
|
+
accum = lambda do | percent, message |
|
50
|
+
processing_log << ("%d -> %s\n" % [percent, message])
|
51
|
+
end
|
52
|
+
|
53
|
+
pipeline = Tracksperanto::Pipeline::Base.new(:progress_block => accum)
|
54
|
+
assert_nothing_raised { pipeline.run(@stabilizer) }
|
55
|
+
reference = File.read(File.dirname(__FILE__) + "/fixtures/processing_log.txt")
|
56
|
+
assert_equal reference, processing_log, "The log output should be the same"
|
57
|
+
end
|
58
|
+
|
46
59
|
def test_run_crashes_with_empty_file
|
47
60
|
empty_file_path = "./input_empty.stabilizer"
|
48
61
|
f = File.open(empty_file_path, "w"){|f| f.write('') }
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: tracksperanto
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 2.6.
|
5
|
+
version: 2.6.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Julik Tarkhanov
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2011-07-
|
13
|
+
date: 2011-07-30 00:00:00 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: flame_channel_parser
|
@@ -188,6 +188,7 @@ files:
|
|
188
188
|
- test/export/test_pftrack_export.rb
|
189
189
|
- test/export/test_shake_export.rb
|
190
190
|
- test/export/test_syntheyes_export.rb
|
191
|
+
- test/fixtures/processing_log.txt
|
191
192
|
- test/helper.rb
|
192
193
|
- test/import/samples/3de_v3/3de_export_v3.txt
|
193
194
|
- test/import/samples/3de_v4/3de_export_cube.txt
|