tracksperanto 3.5.7 → 3.5.8

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -4,8 +4,8 @@ source 'http://rubygems.org'
4
4
  gem "bundler"
5
5
 
6
6
  gem "obuf", "~> 1.1"
7
- gem "tickly", "~> 2.1.5"
8
- gem "bychar", "~> 2"
7
+ gem "tickly", "~> 2.1.6"
8
+ gem "bychar", "~> 3"
9
9
  gem "progressive_io", "~> 1.0"
10
10
  gem "flame_channel_parser", "~> 4.0"
11
11
 
@@ -55,11 +55,6 @@ class Tracksperanto::Import::FlameStabilizer < Tracksperanto::Import::Base
55
55
  class StabilizerParser < FlameChannelParser::Parser
56
56
  USEFUL_CHANNELS = %w( /shift/x /shift/y /ref/x /ref/y ).map(&Regexp.method(:new))
57
57
 
58
- # This method tells the importer whether a channel that has been found in the source
59
- # setup is needed. If that method returns ++false++ the channel will be discarded and not
60
- # kept in memory. Should you need to write a module that scavenges other Flame animation channels
61
- # inherit from this class and rewrite this method to either return +true+ always (then all the channels
62
- # will be recovered) or to return +true+ only for channels that you actually need.
63
58
  def channel_is_useful?(channel_name)
64
59
  USEFUL_CHANNELS.any?{|e| channel_name =~ e }
65
60
  end
@@ -15,6 +15,7 @@ class Tracksperanto::Import::MatchMover < Tracksperanto::Import::Base
15
15
 
16
16
  def each
17
17
  detect_format(@io)
18
+ raise "No tracker data after detecting format" if @io.eof?
18
19
  extract_trackers(@io) { |t| yield(t) }
19
20
  end
20
21
 
@@ -35,6 +36,13 @@ class Tracksperanto::Import::MatchMover < Tracksperanto::Import::Base
35
36
  # as multiline, so we will need to succesively scan until we find our line that contains the dimensions
36
37
  frame_steps_re = /b\( (\d+) (\d+) (\d+) \)/ # b( 0 293 1 )
37
38
  until @first_frame_of_sequence
39
+ # There was nothing fetched, so we just assume the first frame is 0.
40
+ # Or this line contained "}" which terminates the imageSequence block.
41
+ if last_line.nil? || last_line.include?('}')
42
+ @first_frame_of_sequence = 0
43
+ return
44
+ end
45
+
38
46
  digit_groups = last_line.scan(frame_steps_re).flatten
39
47
  if digit_groups.any?
40
48
  @first_frame_of_sequence, length, frame_step = digit_groups.map{|e| e.to_i }
@@ -42,7 +50,6 @@ class Tracksperanto::Import::MatchMover < Tracksperanto::Import::Base
42
50
  end
43
51
  last_line = io.gets
44
52
  end
45
-
46
53
  raise "Cannot detect the start frame of the sequence"
47
54
  end
48
55
 
@@ -64,21 +71,26 @@ class Tracksperanto::Import::MatchMover < Tracksperanto::Import::Base
64
71
  raise "Track didn't close"
65
72
  end
66
73
 
67
- LINE_PATTERN = /(\d+)(\s+)([\-\d\.]+)(\s+)([\-\d\.]+)(\s+)(.+)/
74
+ FLOAT_PATTERN = /[\-\d\.]+/
75
+ LINE_PATTERN = /(\d+)\s+(#{FLOAT_PATTERN})\s+(#{FLOAT_PATTERN})/
68
76
 
69
77
  def extract_key(line)
70
- frame, x, y, residual, rest = line.scan(LINE_PATTERN).flatten.reject{|e| e.strip.empty? }
78
+ frame, x, y = line.scan(LINE_PATTERN).flatten
71
79
  Tracksperanto::Keyframe.new(
72
80
  :frame => (frame.to_i - @first_frame_of_sequence),
73
81
  :abs_x => x,
74
82
  :abs_y => @height - y.to_f, # Top-left in MM
75
- :residual => extract_residual(residual)
83
+ :residual => extract_residual(line)
76
84
  )
77
85
  end
78
86
 
79
- def extract_residual(residual_segment)
80
- # Parse to the first opening brace and pick the residual from there
81
- float_pat = /([\-\d\.]+)/
82
- 1 - residual_segment.scan(float_pat).flatten.shift.to_f
87
+ RESIDUAL_SEGMENT = /p[\*\+]\(\s+?(#{FLOAT_PATTERN})\s+?\)/
88
+
89
+ def extract_residual(line)
90
+ if line =~ RESIDUAL_SEGMENT
91
+ 1- $1.to_f
92
+ else
93
+ 0
94
+ end
83
95
  end
84
96
  end
@@ -28,7 +28,7 @@ class Tracksperanto::Import::NukeScript < Tracksperanto::Import::Base
28
28
  parser.add_node_handler_class(CornerPin2D)
29
29
  parser.add_node_handler_class(Transform)
30
30
 
31
- parser.parse(@io) do | node |
31
+ parser.parse(Bychar.wrap(@io)) do | node |
32
32
  node.trackers.each do | t |
33
33
  report_progress("Scavenging tracker #{t.name}")
34
34
  yield t
@@ -25,17 +25,15 @@ module Tracksperanto::ShakeGrammar
25
25
  # You can use the sentinel to collect data from child nodes for example.
26
26
  def initialize(with_io, sentinel = nil, limit_to_one_stmt = false, stack_depth = 0)
27
27
  # We parse byte by byte, but reading byte by byte is very slow. We therefore use a buffering reader
28
- # that will cache in chunks, and then read from there byte by byte. This yields a substantial speedup (4.9 seconds for the test
28
+ # that will cache in chunks, and then read from there byte by byte.
29
+ # This yields a substantial speedup (4.9 seconds for the test
29
30
  # as opposed to 7.9 without this). We do check for the proper class only once so that when we use nested lexers
30
31
  # we only wrap the passed IO once, and only if necessary.
31
- with_io = Bychar.wrap(with_io) unless with_io.respond_to?(:read_one_char!)
32
+ with_io = Bychar.wrap(with_io) unless with_io.respond_to?(:read_one_char)
32
33
  @io, @stack, @buf, @sentinel, @limit_to_one_stmt, @stack_depth = with_io, [], '', sentinel, limit_to_one_stmt, stack_depth
33
34
 
34
35
  catch(STOP_TOKEN) do
35
- begin
36
- loop { parse }
37
- rescue Bychar::EOF
38
- end
36
+ loop { parse }
39
37
  end
40
38
 
41
39
  @in_comment ? consume_comment! : consume_atom!
@@ -54,8 +52,6 @@ module Tracksperanto::ShakeGrammar
54
52
 
55
53
  def parse
56
54
 
57
- c = @io.read_one_char!
58
-
59
55
  if @buf.length > MAX_BUFFER_SIZE # Wrong format and the buffer is filled up, bail
60
56
  raise WrongInputError, "Atom buffer overflow at #{MAX_BUFFER_SIZE} bytes, this is definitely not a Shake script"
61
57
  end
@@ -64,6 +60,9 @@ module Tracksperanto::ShakeGrammar
64
60
  raise WrongInputError, "Stack overflow at level #{MAX_STACK_DEPTH}, this is probably a LISP program uploaded by accident"
65
61
  end
66
62
 
63
+ c = @io.read_one_char
64
+ throw :__stop if c.nil? # IO has run out
65
+
67
66
  if c == '/' && (@buf[-1].chr rescue nil) == '/' # Comment start
68
67
  # If some other data from this line has been accumulated we first consume that
69
68
  @buf = @buf[0..-2] # everything except the opening slash of the comment
@@ -5,7 +5,7 @@ require 'tempfile'
5
5
 
6
6
  module Tracksperanto
7
7
  PATH = File.expand_path(File.dirname(__FILE__))
8
- VERSION = '3.5.7'
8
+ VERSION = '3.5.8'
9
9
 
10
10
  module Import; end
11
11
  module Export; end
@@ -18,7 +18,7 @@ class Tracksperanto::Blacklist
18
18
  /\.(r3d)$/ => 'Tracksperanto is not a tracking application, it converts tracks. We do not support RAW file formats.',
19
19
  /\.(dpx|tif(f?)|jp(e?)g|png|gif|tga)$/ => 'Tracksperanto is not a tracking application, it converts tracks. We do not support image file formats.',
20
20
  '.sni' => 'We cannot read binary SynthEyes scene files. Export your tracks as one of the supported formats.',
21
- /\.(pfb|pfmp)/ => 'We cannot directly open PFTrack projects, export .2dt files instead',
21
+ /\.(pfb|pfmp|ptp)/ => 'We cannot directly open PFTrack projects, export .2dt files instead',
22
22
  '.mmf' => 'We cannot directly open MatchMover projects, please export your tracks as .rz2 instead',
23
23
  /\.(doc(x?)|xls(x?)|ppt(x?))/ => 'You really think we can process Microsoft Office files? You need a drink.',
24
24
  /\.(abc|fbx)$/ => 'We cannot import 3D scenes such as Alembic or FBX.',
@@ -3,12 +3,6 @@ require File.expand_path(File.dirname(__FILE__)) + '/../helper'
3
3
 
4
4
  class MatchMoverImportTest < Test::Unit::TestCase
5
5
  DELTA = 0.01
6
-
7
- P = File.dirname(__FILE__) + '/samples/match_mover/kipPointsMatchmover.rz2'
8
- P2 = File.dirname(__FILE__) + '/samples/match_mover/NonSequentialMatchmoverPoints.rz2'
9
- P3 = File.dirname(__FILE__) + '/samples/match_mover/cha_171_1020_atb_v001.rz2'
10
- P4 = File.dirname(__FILE__) + '/samples/match_mover/2dtracks.rz2'
11
-
12
6
  def test_introspects_properly
13
7
  i = Tracksperanto::Import::MatchMover
14
8
  assert_equal "MatchMover REALVIZ Ascii Point Tracks .rz2 file", i.human_name
@@ -16,7 +10,7 @@ class MatchMoverImportTest < Test::Unit::TestCase
16
10
  end
17
11
 
18
12
  def test_parsing_with_non_sequential_keyframes
19
- fixture = File.open(P2)
13
+ fixture = File.open(File.dirname(__FILE__) + '/samples/match_mover/NonSequentialMatchmoverPoints.rz2')
20
14
 
21
15
  parser = Tracksperanto::Import::MatchMover.new(:io => fixture)
22
16
  trackers = parser.to_a
@@ -25,7 +19,7 @@ class MatchMoverImportTest < Test::Unit::TestCase
25
19
  end
26
20
 
27
21
  def test_parsing_case_nil_exception
28
- fixture = File.open(P3)
22
+ fixture = File.open(File.dirname(__FILE__) + '/samples/match_mover/cha_171_1020_atb_v001.rz2')
29
23
 
30
24
  parser = Tracksperanto::Import::MatchMover.new(:io => fixture)
31
25
  trackers = parser.to_a
@@ -33,7 +27,7 @@ class MatchMoverImportTest < Test::Unit::TestCase
33
27
  end
34
28
 
35
29
  def test_parsing_from_matchmover
36
- fixture = File.open(P)
30
+ fixture = File.open(File.dirname(__FILE__) + '/samples/match_mover/kipPointsMatchmover.rz2')
37
31
 
38
32
  parser = Tracksperanto::Import::MatchMover.new(:io => fixture)
39
33
  trackers = parser.to_a
@@ -51,17 +45,17 @@ class MatchMoverImportTest < Test::Unit::TestCase
51
45
  assert_equal 0, first_kf.frame
52
46
  assert_in_delta 649.523, first_kf.abs_x, DELTA
53
47
  assert_in_delta 656.071, first_kf.abs_y, DELTA
54
- assert_in_delta 0.2, first_kf.residual, DELTA
48
+ assert_in_delta 0.0, first_kf.residual, DELTA
55
49
 
56
- last_kf = first_t[-1]
57
- assert_equal 130, last_kf.frame
58
- assert_in_delta 603.148, last_kf.abs_x, DELTA
59
- assert_in_delta 351.54, last_kf.abs_y, DELTA
50
+ last_kf = first_t[-2]
51
+ assert_equal 129, last_kf.frame
52
+ assert_in_delta 598.273, last_kf.abs_x, DELTA
53
+ assert_in_delta 367.103, last_kf.abs_y, DELTA
60
54
  assert_in_delta 0.027457, last_kf.residual, DELTA
61
55
  end
62
56
 
63
57
  def test_parsing_from_matchmover_with_multiline_sequence_path
64
- fixture = File.open(P4)
58
+ fixture = File.open(File.dirname(__FILE__) + '/samples/match_mover/2dtracks.rz2')
65
59
 
66
60
  parser = Tracksperanto::Import::MatchMover.new(:io => fixture)
67
61
  trackers = parser.to_a
@@ -79,6 +73,29 @@ class MatchMoverImportTest < Test::Unit::TestCase
79
73
  assert_equal 119, first_kf.frame
80
74
  assert_in_delta 10.715, first_kf.abs_x, DELTA
81
75
  assert_in_delta 461.36, first_kf.abs_y, DELTA
82
- assert_in_delta 0.2, first_kf.residual, DELTA
76
+ assert_in_delta 0.0, first_kf.residual, DELTA
77
+ end
78
+
79
+ def test_parsing_from_file_with_shortened_sequence_format
80
+ fixture = File.open(File.dirname(__FILE__) + '/samples/match_mover/EP_1000_head_trackers_v002.rz2')
81
+
82
+ parser = Tracksperanto::Import::MatchMover.new(:io => fixture)
83
+ trackers = parser.to_a
84
+
85
+ assert_equal 714, parser.width
86
+ assert_equal 480, parser.height
87
+
88
+ assert_equal 7, trackers.length
89
+
90
+ first_t = trackers[0]
91
+ assert_equal "Tracker0002", first_t.name
92
+ assert_equal 130, first_t.length
93
+ first_kf = first_t[0]
94
+
95
+ assert_equal 1017, first_kf.frame
96
+ assert_in_delta 357.89, first_kf.abs_x, DELTA
97
+ assert_in_delta 371.96, first_kf.abs_y, DELTA
98
+ assert_in_delta 0.0, first_kf.residual, DELTA
83
99
  end
100
+
84
101
  end
@@ -24,6 +24,7 @@ class TestBlacklist < Test::Unit::TestCase
24
24
  file.sni
25
25
  file.ma
26
26
  file.mb
27
+ file.ptp
27
28
  file.pfb
28
29
  file.pfmp
29
30
  file.mmf
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{tracksperanto}
8
- s.version = "3.5.7"
8
+ s.version = "3.5.8"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Julik Tarkhanov"]
12
- s.date = %q{2014-12-04}
12
+ s.date = %q{2015-06-04}
13
13
  s.default_executable = %q{tracksperanto}
14
14
  s.description = %q{Converts 2D track exports between different apps like Flame, MatchMover, PFTrack...}
15
15
  s.email = %q{me@julik.nl}
@@ -221,8 +221,8 @@ Gem::Specification.new do |s|
221
221
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
222
222
  s.add_runtime_dependency(%q<bundler>, [">= 0"])
223
223
  s.add_runtime_dependency(%q<obuf>, ["~> 1.1"])
224
- s.add_runtime_dependency(%q<tickly>, ["~> 2.1.5"])
225
- s.add_runtime_dependency(%q<bychar>, ["~> 2"])
224
+ s.add_runtime_dependency(%q<tickly>, ["~> 2.1.6"])
225
+ s.add_runtime_dependency(%q<bychar>, ["~> 3"])
226
226
  s.add_runtime_dependency(%q<progressive_io>, ["~> 1.0"])
227
227
  s.add_runtime_dependency(%q<flame_channel_parser>, ["~> 4.0"])
228
228
  s.add_runtime_dependency(%q<progressbar>, ["= 0.10.0"])
@@ -237,8 +237,8 @@ Gem::Specification.new do |s|
237
237
  else
238
238
  s.add_dependency(%q<bundler>, [">= 0"])
239
239
  s.add_dependency(%q<obuf>, ["~> 1.1"])
240
- s.add_dependency(%q<tickly>, ["~> 2.1.5"])
241
- s.add_dependency(%q<bychar>, ["~> 2"])
240
+ s.add_dependency(%q<tickly>, ["~> 2.1.6"])
241
+ s.add_dependency(%q<bychar>, ["~> 3"])
242
242
  s.add_dependency(%q<progressive_io>, ["~> 1.0"])
243
243
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
244
244
  s.add_dependency(%q<progressbar>, ["= 0.10.0"])
@@ -254,8 +254,8 @@ Gem::Specification.new do |s|
254
254
  else
255
255
  s.add_dependency(%q<bundler>, [">= 0"])
256
256
  s.add_dependency(%q<obuf>, ["~> 1.1"])
257
- s.add_dependency(%q<tickly>, ["~> 2.1.5"])
258
- s.add_dependency(%q<bychar>, ["~> 2"])
257
+ s.add_dependency(%q<tickly>, ["~> 2.1.6"])
258
+ s.add_dependency(%q<bychar>, ["~> 3"])
259
259
  s.add_dependency(%q<progressive_io>, ["~> 1.0"])
260
260
  s.add_dependency(%q<flame_channel_parser>, ["~> 4.0"])
261
261
  s.add_dependency(%q<progressbar>, ["= 0.10.0"])
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: 29
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 3
8
8
  - 5
9
- - 7
10
- version: 3.5.7
9
+ - 8
10
+ version: 3.5.8
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: 2014-12-04 00:00:00 +01:00
18
+ date: 2015-06-04 00:00:00 +02:00
19
19
  default_executable: tracksperanto
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -53,12 +53,12 @@ dependencies:
53
53
  requirements:
54
54
  - - ~>
55
55
  - !ruby/object:Gem::Version
56
- hash: 1
56
+ hash: 7
57
57
  segments:
58
58
  - 2
59
59
  - 1
60
- - 5
61
- version: 2.1.5
60
+ - 6
61
+ version: 2.1.6
62
62
  type: :runtime
63
63
  version_requirements: *id003
64
64
  prerelease: false
@@ -69,10 +69,10 @@ dependencies:
69
69
  requirements:
70
70
  - - ~>
71
71
  - !ruby/object:Gem::Version
72
- hash: 7
72
+ hash: 5
73
73
  segments:
74
- - 2
75
- version: "2"
74
+ - 3
75
+ version: "3"
76
76
  type: :runtime
77
77
  version_requirements: *id004
78
78
  prerelease: false