Class: Tracksperanto::Import::ShakeScript::TrackExtractor

Inherits:
ShakeGrammar::Catcher show all
Includes:
ZipTuples
Defined in:
lib/import/shake_script.rb

Overview

Extractor. Here we define copies of Shake’s standard node creation functions.

Constant Summary

Constants inherited from ShakeGrammar::Lexer

ShakeGrammar::Lexer::MAX_BUFFER_SIZE, ShakeGrammar::Lexer::MAX_STACK_DEPTH, ShakeGrammar::Lexer::STOP_TOKEN

Instance Attribute Summary

Attributes inherited from ShakeGrammar::Lexer

#sentinel, #stack

Instance Method Summary collapse

Methods included from ZipTuples

#zip_curve_tuples

Methods inherited from ShakeGrammar::Lexer

#initialize

Constructor Details

This class inherits a constructor from Tracksperanto::ShakeGrammar::Lexer

Instance Method Details

#atom_is_tracker_assignment?(a) ⇒ Boolean

An atom that is a tracker node will look like this

:assign, [:vardef, “Stabilize2”], [:retval, [:trk, <T “track1” with 116 keyframes>, <T “track2” with 116 keyframes>, <T “track3” with 116 keyframes>, <T “track4” with 89 keyframes>]]

a Stabilize though will look like this

:assign, [:vardef, “Stabilize1”], [:retval, [:trk, <T “track1” with 116 keyframes>, <T “track2” with 116 keyframes>, <T “track3” with 116 keyframes>]]

Returns:

  • (Boolean)


73
74
75
# File 'lib/import/shake_script.rb', line 73

def atom_is_tracker_assignment?(a)
  deep_include?(a, :trk)
end

#deep_include?(array_or_element, atom_name) ⇒ Boolean

Find whether the passed atom includes a [:trk] on any level

Returns:

  • (Boolean)


58
59
60
61
62
63
64
65
66
67
# File 'lib/import/shake_script.rb', line 58

def deep_include?(array_or_element, atom_name)
  return false unless array_or_element.is_a?(Array)
  return true if array_or_element[0] == atom_name
  
  array_or_element.each do | elem |
     return true if deep_include?(elem, atom_name)
  end
  
  false
end

#hermite(extrapolation_type, *keyframes) ⇒ Object

Hermite interpolation looks like this Hermite(0,@1,@2) The first value in the array is the keyframe value, the other two are tangent positions (which we discard)



91
92
93
94
95
# File 'lib/import/shake_script.rb', line 91

def hermite(extrapolation_type, *keyframes)
  report_progress("Translating Hermite curve, removing tangents")
  remap_keyframes_against_negative_at!(keyframes)
  keyframes.map{ |kf| [kf.at, kf.value[0]] }
end

#linear(extrapolation_type, *keyframes) ⇒ Object Also known as: nspline, jspline

For Linear() curve calls. If someone selected JSpline or Hermite it’s his problem. We put the frame number at the beginning since it works witih oru tuple zipper



79
80
81
82
83
# File 'lib/import/shake_script.rb', line 79

def linear(extrapolation_type, *keyframes)
  report_progress("Translating Linear animation")
  remap_keyframes_against_negative_at!(keyframes)
  keyframes.map { |kf| [kf.at , kf.value] }
end

#matchmove(bgImage, fgImage, applyTransform, trackType, track1X, track1Y, matchX, matchY, track2X, track2Y, scale, rotation, track3X, track3Y, track4X, track4Y, *others) ⇒ Object

image = MatchMove(

  Background,
  Foreground,
  applyTransform,
  "trackType",
  track1X,
  track1Y,
  matchX,
  matchY,
  track2X,
  track2Y,
  scale,
  rotation,
  track3X,
  track3Y,
  track4X,
  track4Y,
  x1, 
  y1,
  x2,
  y2,
  x3,
  y3,
  x4,
  y4,
  "xFilter",
  "yFilter",
  motionBlur, 
  shutterTiming,
  shutterOffset,
  referenceFrame,
  "compositeType",
  clipMode,
 "trackRange",
  "subPixelRes",
  "matchSpace",
  float referenceTolerance,
  "referenceBehavior",
  float failureTolerance,
  "failureBehavior",
  int limitProcessing,
  ...
);


218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
# File 'lib/import/shake_script.rb', line 218

def matchmove(bgImage, fgImage, applyTransform,
  trackType,
  track1X,
  track1Y,
  matchX,
  matchY,
  track2X,
  track2Y,
  scale,
  rotation,
  track3X,
  track3Y,
  track4X,
  track4Y, *others)
  
  report_progress("Parsing MatchMove node")
  [
    collect_stabilizer_tracker("track1", track1X, track1Y),
    collect_stabilizer_tracker("track2", track2X, track2Y),
    collect_stabilizer_tracker("track3", track3X, track3Y),
    collect_stabilizer_tracker("track4", track4X, track4Y),
  ].compact.unshift(:trk)
end

#push(atom) ⇒ Object

Normally, we wouldn’t need to look for the variable name from inside of the funcall. However, in this case we DO want to take this shortcut so we know how the tracker node is called



45
46
47
48
49
50
51
52
53
54
55
# File 'lib/import/shake_script.rb', line 45

def push(atom)
  return super unless atom_is_tracker_assignment?(atom)
  
  node_name = atom[1][-1]
  trackers = atom[2][1][1..-1]
  trackers.map do | tracker |
    tracker.name = [node_name, tracker.name].join("_")
    # THIS IS THE MOST IMPORTANT THINGO
    sentinel.tracker_proc.call(tracker)
  end
end

#settimerange(str) ⇒ Object

SetTimeRange(“-5-15”) // sets time range of comp We use it to avoid producing keyframes which start at negative frames



39
40
41
# File 'lib/import/shake_script.rb', line 39

def settimerange(str)
  sentinel.start_frame = str.to_i if str.to_i < 0
end

#stabilize(imageIn, applyTransform, inverseTransform, trackType, track1X, track1Y, stabilizeX, stabilizeY, track2X, track2Y, matchScale, matchRotation, track3X, track3Y, track4X, track4Y, *useless_args) ⇒ Object

stabilize

image In,
int applyTransform,
int inverseTransform
const char * trackType,
float track1X,
float track1Y,
int stabilizeX,
int stabilizeY,
float track2X,
float track2Y,
int matchScale,
int matchRotation,
float track3X,
float track3Y,
float track4X,
float track4Y,
const char * xFilter,
const char * yFilter,
const char * transformationOrder,
float motionBlur, 
float shutterTiming,
float shutterOffset,
float referenceFrame,
float aspectRatio,
...

;



156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/import/shake_script.rb', line 156

def stabilize(imageIn, applyTransform, inverseTransform, trackType,
  track1X, track1Y,
  stabilizeX, stabilizeY,
  track2X, track2Y,
  matchScale,
  matchRotation,
  track3X, track3Y,
  track4X, track4Y,
  *useless_args)
  
  report_progress("Parsing Stabilize node")
  [
    collect_stabilizer_tracker("track1", track1X, track1Y),
    collect_stabilizer_tracker("track2", track2X, track2Y),
    collect_stabilizer_tracker("track3", track3X, track3Y),
    collect_stabilizer_tracker("track4", track4X, track4Y),
  ].compact.unshift(:trk)
end

#tracker(input, trackRange, subPixelRes, matchSpace, referenceTolerance, referenceBehavior, failureTolerance, failureBehavior, limitProcessing, referencFrame, s1, s2, s3, s4, s5, s6, *trackers) ⇒ Object

image Tracker(

 image In,
 const char * trackRange,
 const char * subPixelRes,
 const char * matchSpace,
 float referenceTolerance,
 const char * referenceBehavior,
 float failureTolerance,
 const char * failureBehavior,
 int limitProcessing,
 float referencFrame 
 ...
);


116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/import/shake_script.rb', line 116

def tracker(input, trackRange, subPixelRes, matchSpace,
    referenceTolerance, referenceBehavior, failureTolerance, failureBehavior, limitProcessing, referencFrame, 
    s1, s2, s3, s4, s5, s6, *trackers)
  flat_tracks = if (s1 == "v2.0") # The Shake version stupid Winfucks users didn't get
    trackers
  else
    [s1, s2, s3, s4, s4, s6] + trackers
  end
  
  report_progress("Parsing Tracker node")
  collect_trackers_from(flat_tracks).unshift(:trk)
end