flame_channel_parser 3.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +4 -0
- data/Gemfile +10 -0
- data/History.txt +5 -0
- data/README.rdoc +4 -2
- data/Rakefile +23 -10
- data/bin/{bake_flame_timewarp → framecurve_from_flame} +5 -1
- data/bin/framecurve_to_flame +22 -0
- data/flame_channel_parser.gemspec +130 -0
- data/lib/builder.rb +86 -0
- data/lib/flame_channel_parser.rb +31 -4
- data/lib/framecurve_writers/base.rb +49 -0
- data/lib/framecurve_writers/batch_timewarp.rb +41 -0
- data/lib/framecurve_writers/kronos.rb +23 -0
- data/lib/framecurve_writers/softfx_timewarp.rb +82 -0
- data/lib/framecurve_writers/templates/BatchTW.xml +118 -0
- data/lib/framecurve_writers/templates/SampleKronos.F_Kronos +376 -0
- data/lib/framecurve_writers/templates/TW_Sample.timewarp +79 -0
- data/lib/framecurve_writers/templates/key.xml +10 -0
- data/lib/timewarp_extractor.rb +18 -2
- data/lib/xml_parser.rb +90 -0
- data/test/helper.rb +18 -0
- data/test/snaps/BatchTimewar_proper.xml +157 -0
- data/test/snaps/BatchTimewarp_ext1.timewarp_node +1 -0
- data/test/test_base_timewarp_writer.rb +22 -0
- data/test/test_batch_timewarp_writer.rb +18 -0
- data/test/test_channel.rb +1 -2
- data/test/test_cli.rb +14 -13
- data/test/test_cli_framecurve_to_flame.rb +45 -0
- data/test/test_cli_timewarp_extractor.rb +19 -9
- data/test/test_extractor.rb +1 -3
- data/test/test_flame_builder.rb +68 -0
- data/test/test_flame_channel_parser.rb +2 -2
- data/test/test_interpolator.rb +15 -5
- data/test/test_key.rb +2 -2
- data/test/test_kronos_timewarp_writer.rb +16 -0
- data/test/test_segments.rb +1 -2
- data/test/test_softfx_timewarp_writer.rb +16 -0
- data/test/test_timewarp_extractor.rb +2 -4
- data/test/test_xml_setup.rb +37 -0
- data/test/timewarp_examples/TW_16_010_v01.output.txt +430 -428
- data/test/timewarp_examples/simple.framecurve.txt +32 -0
- data/test/timewarp_export_samples/BatchTW.timewarp_node +145 -0
- data/test/timewarp_export_samples/Kronos.F_Kronos +403 -0
- data/test/timewarp_export_samples/SoftFX.timewarp +81 -0
- metadata +127 -168
- data/.gemtest +0 -0
- data/Manifest.txt +0 -52
@@ -0,0 +1,79 @@
|
|
1
|
+
TimewarpFileVersion 1.0
|
2
|
+
CreationDate Wed Dec 28 08:46:50 2011
|
3
|
+
|
4
|
+
|
5
|
+
Fields 0
|
6
|
+
Frames 28
|
7
|
+
Origin 1
|
8
|
+
RenderType yes
|
9
|
+
SamplingStep 0
|
10
|
+
Interpolation 0
|
11
|
+
FlowQuality 2
|
12
|
+
Animation
|
13
|
+
Channel Speed
|
14
|
+
Extrapolation linear
|
15
|
+
Value 100
|
16
|
+
End
|
17
|
+
Channel Timing/Timing
|
18
|
+
Extrapolation constant
|
19
|
+
Value 1
|
20
|
+
Size 3
|
21
|
+
KeyVersion 2
|
22
|
+
Key 0
|
23
|
+
Frame 1
|
24
|
+
Value 1
|
25
|
+
RHandleX 5.66666651
|
26
|
+
RHandleY 6.99977636
|
27
|
+
LHandleX 0.75
|
28
|
+
LHandleY 0.75
|
29
|
+
CurveMode bezier
|
30
|
+
CurveOrder cubic
|
31
|
+
LeftAutomaticSlope no
|
32
|
+
TangentMode manual
|
33
|
+
End
|
34
|
+
Key 1
|
35
|
+
Frame 15
|
36
|
+
Value 18.9993286
|
37
|
+
RHandleX 19.333334
|
38
|
+
RHandleY 23.3326626
|
39
|
+
LHandleX 10.333333
|
40
|
+
LHandleY 14.3326616
|
41
|
+
CurveMode bezier
|
42
|
+
CurveOrder cubic
|
43
|
+
TangentMode smooth
|
44
|
+
End
|
45
|
+
Key 2
|
46
|
+
Frame 28
|
47
|
+
Value 28
|
48
|
+
RHandleX 32.3333321
|
49
|
+
RHandleY 31.0002232
|
50
|
+
LHandleX 23.666666
|
51
|
+
LHandleY 24.9997768
|
52
|
+
CurveMode bezier
|
53
|
+
CurveOrder cubic
|
54
|
+
TangentMode smooth
|
55
|
+
End
|
56
|
+
Uncollapsed
|
57
|
+
End
|
58
|
+
Channel Mix/Mix
|
59
|
+
Extrapolation linear
|
60
|
+
Value 0
|
61
|
+
End
|
62
|
+
Channel Trail/Pre_Trail
|
63
|
+
Extrapolation linear
|
64
|
+
Value 1
|
65
|
+
End
|
66
|
+
Channel Trail/Pre_Weight
|
67
|
+
Extrapolation linear
|
68
|
+
Value 100
|
69
|
+
End
|
70
|
+
Channel Trail/Post_Trail
|
71
|
+
Extrapolation linear
|
72
|
+
Value 1
|
73
|
+
End
|
74
|
+
Channel Trail/Post_Weight
|
75
|
+
Extrapolation linear
|
76
|
+
Value 100
|
77
|
+
End
|
78
|
+
ChannelEnd
|
79
|
+
End
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<Key Index="$idx">
|
2
|
+
<Frame>$frame</Frame>
|
3
|
+
<Value>$value</Value>
|
4
|
+
<RHandleX>32.666668</RHandleX>
|
5
|
+
<RHandleY>36.319729</RHandleY>
|
6
|
+
<LHandleX>16.333334</LHandleX>
|
7
|
+
<LHandleY>14.986395</LHandleY>
|
8
|
+
<CurveMode>hermite</CurveMode>
|
9
|
+
<CurveOrder>linear</CurveOrder>
|
10
|
+
</Key>
|
data/lib/timewarp_extractor.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require "framecurve"
|
2
|
+
|
1
3
|
module FlameChannelParser
|
2
4
|
class TimewarpExtractor
|
3
5
|
|
@@ -5,7 +7,7 @@ module FlameChannelParser
|
|
5
7
|
CHANNELS = %( Timing/Timing Frame )
|
6
8
|
|
7
9
|
class X < Extractor
|
8
|
-
|
10
|
+
|
9
11
|
# This one is overridden here since instead of looking for a particular channel we are looking
|
10
12
|
# for matches from a list
|
11
13
|
def find_channel_in(channels, channel_path)
|
@@ -14,8 +16,22 @@ module FlameChannelParser
|
|
14
16
|
return detected_channel if detected_channel
|
15
17
|
raise ChannelNotFoundError, compose_channel_not_found_message(CHANNELS.join(' or '), channels)
|
16
18
|
end
|
19
|
+
|
20
|
+
FRAMECURVE_FORMAT = "%d\t%.5f\r\n"
|
21
|
+
|
22
|
+
# Overridden to force CRLF line breaks as per Framecurve spec
|
23
|
+
def write_frame(to_io, frame, value)
|
24
|
+
@c.tuple!(frame, value)
|
25
|
+
end
|
26
|
+
|
27
|
+
# Overridden to write a framecurve header
|
28
|
+
def write_channel(interpolator, to_io, from_frame_i, to_frame_i)
|
29
|
+
@c = Framecurve::Curve.new
|
30
|
+
super
|
31
|
+
Framecurve::Serializer.new.serialize(to_io, @c)
|
32
|
+
end
|
17
33
|
end
|
18
|
-
|
34
|
+
|
19
35
|
def extract(file_path, options)
|
20
36
|
return X.extract(file_path, options)
|
21
37
|
end
|
data/lib/xml_parser.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require "rexml/streamlistener"
|
3
|
+
|
4
|
+
class FlameChannelParser::XMLParser < FlameChannelParser::Parser
|
5
|
+
# Here you can assign a logger proc or a lambda that will be call'ed with progress reports
|
6
|
+
attr_accessor :logger_proc
|
7
|
+
|
8
|
+
# A SAX-based translation layer
|
9
|
+
class XMLToSetup
|
10
|
+
include REXML::StreamListener
|
11
|
+
|
12
|
+
def initialize(vanilla_setup)
|
13
|
+
@dest = vanilla_setup
|
14
|
+
@indent = 0
|
15
|
+
@in_channel = false
|
16
|
+
@path = []
|
17
|
+
end
|
18
|
+
|
19
|
+
# <KFrames>
|
20
|
+
# <Key Index="0">
|
21
|
+
# <Frame>1.000000</Frame>
|
22
|
+
# <Value>100</Value>
|
23
|
+
# <RHandleX>1.297667</RHandleX>
|
24
|
+
# <RHandleY>100.000000</RHandleY>
|
25
|
+
# <LHandleX>0.750000</LHandleX>
|
26
|
+
# <LHandleY>100.000000</LHandleY>
|
27
|
+
# <CurveMode>hermite</CurveMode>
|
28
|
+
# <CurveOrder>linear</CurveOrder>
|
29
|
+
# </Key>
|
30
|
+
# </KFrames>
|
31
|
+
def tag_start(element, attributes)
|
32
|
+
@path.push(element)
|
33
|
+
if element == "Channel"
|
34
|
+
channel_name = attributes["Name"]
|
35
|
+
@in_channel = true
|
36
|
+
# Compose the full channel name
|
37
|
+
|
38
|
+
@dest.puts("Channel %s" % channel_name)
|
39
|
+
elsif element == "Key"
|
40
|
+
@in_key = true
|
41
|
+
@dest.puts("\tKey %d" % attributes["Index"].to_i)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def text(text)
|
46
|
+
@text = text
|
47
|
+
end
|
48
|
+
|
49
|
+
def tag_end(element)
|
50
|
+
@path.pop
|
51
|
+
if element == "Channel"
|
52
|
+
@in_channel = false
|
53
|
+
@dest.puts("\tEnd")
|
54
|
+
end
|
55
|
+
|
56
|
+
if element == "Key"
|
57
|
+
@in_key = false
|
58
|
+
@dest.puts("\t\tEnd")
|
59
|
+
end
|
60
|
+
|
61
|
+
if @in_key
|
62
|
+
@dest.puts("\t\t" + transfo(element) + " " + @text)
|
63
|
+
end
|
64
|
+
|
65
|
+
if !@in_key && @in_channel
|
66
|
+
@dest.puts("\t" + transfo(element) + " " + @text)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def transfo(t)
|
71
|
+
t == "Extrap" ? "Extrapolation" : t
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Parses the setup passed in the IO. If a block is given to the method it will yield Channel
|
76
|
+
# objects one by one instead of accumulating them into an array (useful for big setups)
|
77
|
+
def parse(io)
|
78
|
+
# Ok this is gothic BUT needed. What we do is we transform the XML setup into the OLD
|
79
|
+
# setup format, after which we run it through the OLD parser all the same.
|
80
|
+
# I am almost sure that ADSK does the same.
|
81
|
+
t = Tempfile.new("bx")
|
82
|
+
REXML::Document.parse_stream(io, XMLToSetup.new(t))
|
83
|
+
t.rewind
|
84
|
+
if block_given?
|
85
|
+
super(t, &Proc.new)
|
86
|
+
else
|
87
|
+
super(t)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "stringio"
|
3
|
+
require "tempfile"
|
4
|
+
require "cli_test"
|
5
|
+
|
6
|
+
require File.dirname(__FILE__) + "/../lib/flame_channel_parser"
|
7
|
+
|
8
|
+
class Test::Unit::TestCase
|
9
|
+
def assert_same_buffer(ref_buffer, actual_buffer, message = "The line should be identical")
|
10
|
+
[ref_buffer, actual_buffer].each{|io| io.rewind }
|
11
|
+
at_line = 0
|
12
|
+
until ref_buffer.eof? && actual_buffer.eof?
|
13
|
+
at_line += 1
|
14
|
+
reference_line, output_line = ref_buffer.readline, actual_buffer.readline
|
15
|
+
assert_equal reference_line, output_line, "Line #{at_line} - #{message}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
<?xml version="1.0"?>
|
2
|
+
<Setup>
|
3
|
+
<Base>
|
4
|
+
<Version>7.130000</Version>
|
5
|
+
<NAME>timewarp3</NAME>
|
6
|
+
<Note/>
|
7
|
+
<Expanded>False</Expanded>
|
8
|
+
<ScrollBar>0</ScrollBar>
|
9
|
+
<Frames>0</Frames>
|
10
|
+
<Current_Time>82</Current_Time>
|
11
|
+
<Input_DataType>3</Input_DataType>
|
12
|
+
<ClampMode>0</ClampMode>
|
13
|
+
<AdapDegrad>False</AdapDegrad>
|
14
|
+
</Base>
|
15
|
+
<State>
|
16
|
+
<TW_FlowQuality>4</TW_FlowQuality>
|
17
|
+
<TW_DoBlur>False</TW_DoBlur>
|
18
|
+
<TW_BlurPhase>0</TW_BlurPhase>
|
19
|
+
<TW_DoBlurReference>False</TW_DoBlurReference>
|
20
|
+
<TW_BlurRefColor>
|
21
|
+
<R>1.000000</R>
|
22
|
+
<G>0.000000</G>
|
23
|
+
<B>0.000000</B>
|
24
|
+
<A>1.000000</A>
|
25
|
+
</TW_BlurRefColor>
|
26
|
+
<TW_FrameMode>0</TW_FrameMode>
|
27
|
+
<TW_SamplingMode>0</TW_SamplingMode>
|
28
|
+
<TW_StartFrameIn>1</TW_StartFrameIn>
|
29
|
+
<TW_EndFrameIn>102</TW_EndFrameIn>
|
30
|
+
<TW_RenderMode>0</TW_RenderMode>
|
31
|
+
<TW_ReverseCurves>False</TW_ReverseCurves>
|
32
|
+
<TW_HeadMode>0</TW_HeadMode>
|
33
|
+
<TW_TailMode>0</TW_TailMode>
|
34
|
+
<TW_Regen>False</TW_Regen>
|
35
|
+
<TW_RetimerMode>1</TW_RetimerMode>
|
36
|
+
<TW_ReferencePointX>
|
37
|
+
<Channel Name="X"/>
|
38
|
+
</TW_ReferencePointX>
|
39
|
+
<TW_ReferencePointY>
|
40
|
+
<Channel Name="Y"/>
|
41
|
+
</TW_ReferencePointY>
|
42
|
+
<TW_Speed>
|
43
|
+
<Channel Name="Speed">
|
44
|
+
<Extrap>constant</Extrap>
|
45
|
+
<Value>100</Value>
|
46
|
+
<Size>1</Size>
|
47
|
+
<KeyVersion>2.000000</KeyVersion>
|
48
|
+
<KFrames>
|
49
|
+
<Key Index="0">
|
50
|
+
<Frame>1.000000</Frame>
|
51
|
+
<Value>100</Value>
|
52
|
+
<RHandleX>1.297667</RHandleX>
|
53
|
+
<RHandleY>100.000000</RHandleY>
|
54
|
+
<LHandleX>0.750000</LHandleX>
|
55
|
+
<LHandleY>100.000000</LHandleY>
|
56
|
+
<CurveMode>hermite</CurveMode>
|
57
|
+
<CurveOrder>linear</CurveOrder>
|
58
|
+
</Key>
|
59
|
+
</KFrames>
|
60
|
+
</Channel>
|
61
|
+
</TW_Speed>
|
62
|
+
<TW_SpeedTiming>
|
63
|
+
<Channel Name="SpeedTiming">
|
64
|
+
<Extrap>linear</Extrap>
|
65
|
+
<Value>1</Value>
|
66
|
+
<Size>1</Size>
|
67
|
+
<KeyVersion>2.000000</KeyVersion>
|
68
|
+
<KFrames>
|
69
|
+
<Key Index="0">
|
70
|
+
<Frame>1.000000</Frame>
|
71
|
+
<Value>1</Value>
|
72
|
+
<RHandleX>1.250000</RHandleX>
|
73
|
+
<RHandleY>1.250000</RHandleY>
|
74
|
+
<LHandleX>0.750000</LHandleX>
|
75
|
+
<LHandleY>0.750000</LHandleY>
|
76
|
+
<CurveMode>hermite</CurveMode>
|
77
|
+
<CurveOrder>quadratic</CurveOrder>
|
78
|
+
<RAutoSlope>False</RAutoSlope>
|
79
|
+
<LAutoSlope>False</LAutoSlope>
|
80
|
+
<TangentMode>manual</TangentMode>
|
81
|
+
</Key>
|
82
|
+
</KFrames>
|
83
|
+
</Channel>
|
84
|
+
</TW_SpeedTiming>
|
85
|
+
<TW_Timing>
|
86
|
+
<Channel Name="Timing">
|
87
|
+
<Extrap>linear</Extrap>
|
88
|
+
<Value>87.7692261</Value>
|
89
|
+
<Size>4</Size>
|
90
|
+
<KeyVersion>2.000000</KeyVersion>
|
91
|
+
<KFrames>
|
92
|
+
<Key Index="0">
|
93
|
+
<Frame>1.000000</Frame>
|
94
|
+
<Value>1</Value>
|
95
|
+
<RHandleX>8.666667</RHandleX>
|
96
|
+
<RHandleY>9.000000</RHandleY>
|
97
|
+
<LHandleX>0.750000</LHandleX>
|
98
|
+
<LHandleY>0.750000</LHandleY>
|
99
|
+
<CurveMode>hermite</CurveMode>
|
100
|
+
<CurveOrder>linear</CurveOrder>
|
101
|
+
</Key>
|
102
|
+
<Key Index="1">
|
103
|
+
<Frame>24.000000</Frame>
|
104
|
+
<Value>25</Value>
|
105
|
+
<RHandleX>32.666668</RHandleX>
|
106
|
+
<RHandleY>36.319729</RHandleY>
|
107
|
+
<LHandleX>16.333334</LHandleX>
|
108
|
+
<LHandleY>14.986395</LHandleY>
|
109
|
+
<CurveMode>hermite</CurveMode>
|
110
|
+
<CurveOrder>linear</CurveOrder>
|
111
|
+
</Key>
|
112
|
+
<Key Index="2">
|
113
|
+
<Frame>50.000000</Frame>
|
114
|
+
<Value>65</Value>
|
115
|
+
<RHandleX>67.333336</RHandleX>
|
116
|
+
<RHandleY>82.111107</RHandleY>
|
117
|
+
<LHandleX>41.333332</LHandleX>
|
118
|
+
<LHandleY>56.444447</LHandleY>
|
119
|
+
<CurveMode>hermite</CurveMode>
|
120
|
+
<CurveOrder>linear</CurveOrder>
|
121
|
+
</Key>
|
122
|
+
<Key Index="3">
|
123
|
+
<Frame>102.000000</Frame>
|
124
|
+
<Value>102</Value>
|
125
|
+
<RHandleX>135.666672</RHandleX>
|
126
|
+
<RHandleY>117.420235</RHandleY>
|
127
|
+
<LHandleX>68.333336</LHandleX>
|
128
|
+
<LHandleY>86.579773</LHandleY>
|
129
|
+
<CurveMode>hermite</CurveMode>
|
130
|
+
<CurveOrder>linear</CurveOrder>
|
131
|
+
</Key>
|
132
|
+
</KFrames>
|
133
|
+
</Channel>
|
134
|
+
</TW_Timing>
|
135
|
+
<TW_BlurSamplesChannel>
|
136
|
+
<Channel Name="Samples"/>
|
137
|
+
</TW_BlurSamplesChannel>
|
138
|
+
<TW_BlurShutterChannel>
|
139
|
+
<Channel Name="Shutter"/>
|
140
|
+
</TW_BlurShutterChannel>
|
141
|
+
<TW_Mix>
|
142
|
+
<Channel Name="MixAmount"/>
|
143
|
+
</TW_Mix>
|
144
|
+
<TW_PreTrail>
|
145
|
+
<Channel Name="Pre"/>
|
146
|
+
</TW_PreTrail>
|
147
|
+
<TW_PreWeight>
|
148
|
+
<Channel Name="Pre"/>
|
149
|
+
</TW_PreWeight>
|
150
|
+
<TW_PostTrail>
|
151
|
+
<Channel Name="Post"/>
|
152
|
+
</TW_PostTrail>
|
153
|
+
<TW_PostWeight>
|
154
|
+
<Channel Name="Post"/>
|
155
|
+
</TW_PostWeight>
|
156
|
+
</State>
|
157
|
+
</Setup>
|
@@ -0,0 +1 @@
|
|
1
|
+
<Setup><Base><Version>7.130000</Version><NAME>timewarp3</NAME><Note></Note><Expanded>False</Expanded><ScrollBar>0</ScrollBar><Frames>0</Frames><Current_Time>82</Current_Time><Input_DataType>3</Input_DataType><ClampMode>0</ClampMode><AdapDegrad>False</AdapDegrad></Base><State><TW_FlowQuality>4</TW_FlowQuality><TW_DoBlur>False</TW_DoBlur><TW_BlurPhase>0</TW_BlurPhase><TW_DoBlurReference>False</TW_DoBlurReference><TW_BlurRefColor><R>1.000000</R><G>0.000000</G><B>0.000000</B><A>1.000000</A></TW_BlurRefColor><TW_FrameMode>0</TW_FrameMode><TW_SamplingMode>0</TW_SamplingMode><TW_StartFrameIn>1</TW_StartFrameIn><TW_EndFrameIn>102</TW_EndFrameIn><TW_RenderMode>0</TW_RenderMode><TW_ReverseCurves>False</TW_ReverseCurves><TW_HeadMode>0</TW_HeadMode><TW_TailMode>0</TW_TailMode><TW_Regen>False</TW_Regen><TW_RetimerMode>1</TW_RetimerMode><TW_ReferencePointX><Channel Name="X"/></TW_ReferencePointX><TW_ReferencePointY><Channel Name="Y"/></TW_ReferencePointY><TW_Speed><Channel Name="Speed"><Extrap>constant</Extrap><Value>100</Value><Size>1</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>100</Value><RHandleX>1.297667</RHandleX><RHandleY>100.000000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>100.000000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key></KFrames></Channel></TW_Speed><TW_SpeedTiming><Channel Name="SpeedTiming"><Extrap>linear</Extrap><Value>1</Value><Size>1</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>1</Value><RHandleX>1.250000</RHandleX><RHandleY>1.250000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>0.750000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>quadratic</CurveOrder><RAutoSlope>False</RAutoSlope><LAutoSlope>False</LAutoSlope><TangentMode>manual</TangentMode></Key></KFrames></Channel></TW_SpeedTiming><TW_Timing><Channel Name="Timing"><Extrap>linear</Extrap><Value>87.7692261</Value><Size>4</Size><KeyVersion>2.000000</KeyVersion><KFrames><Key Index="0"><Frame>1.000000</Frame><Value>1</Value><RHandleX>8.666667</RHandleX><RHandleY>9.000000</RHandleY><LHandleX>0.750000</LHandleX><LHandleY>0.750000</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="1"><Frame>24.000000</Frame><Value>25</Value><RHandleX>32.666668</RHandleX><RHandleY>36.319729</RHandleY><LHandleX>16.333334</LHandleX><LHandleY>14.986395</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="2"><Frame>50.000000</Frame><Value>65</Value><RHandleX>67.333336</RHandleX><RHandleY>82.111107</RHandleY><LHandleX>41.333332</LHandleX><LHandleY>56.444447</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key><Key Index="3"><Frame>102.000000</Frame><Value>102</Value><RHandleX>135.666672</RHandleX><RHandleY>117.420235</RHandleY><LHandleX>68.333336</LHandleX><LHandleY>86.579773</LHandleY><CurveMode>hermite</CurveMode><CurveOrder>linear</CurveOrder></Key></KFrames></Channel></TW_Timing><TW_BlurSamplesChannel><Channel Name="Samples"/></TW_BlurSamplesChannel><TW_BlurShutterChannel><Channel Name="Shutter"/></TW_BlurShutterChannel><TW_Mix><Channel Name="MixAmount"/></TW_Mix><TW_PreTrail><Channel Name="Pre"/></TW_PreTrail><TW_PreWeight><Channel Name="Pre"/></TW_PreWeight><TW_PostTrail><Channel Name="Post"/></TW_PostTrail><TW_PostWeight><Channel Name="Post"/></TW_PostWeight></State></Setup>
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestBaseTimewarpWriter < Test::Unit::TestCase
|
4
|
+
def test_with_each_writer
|
5
|
+
pack = []
|
6
|
+
FlameChannelParser::FramecurveWriters::Base.with_each_writer do | w |
|
7
|
+
pack.push(w)
|
8
|
+
end
|
9
|
+
assert_equal [FlameChannelParser::FramecurveWriters::SoftfxTimewarp,
|
10
|
+
FlameChannelParser::FramecurveWriters::BatchTimewarp,
|
11
|
+
FlameChannelParser::FramecurveWriters::Kronos], pack
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_write_from_framecurve
|
15
|
+
c = Framecurve::Curve.new(Framecurve::Tuple.new(10, 123.45), Framecurve::Tuple.new(15, 456.78))
|
16
|
+
b = FlameChannelParser::FramecurveWriters::Base.new
|
17
|
+
buf = StringIO.new
|
18
|
+
b.run_export_from_framecurve(buf, c)
|
19
|
+
assert_equal "10 123.45000\n11 190.11600\n12 256.78200\n13 323.44800\n14 390.11400\n15 456.78000\n", buf.string
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require "helper"
|
2
|
+
|
3
|
+
class TestBatchTimewarpWriter < Test::Unit::TestCase
|
4
|
+
def test_simple_export
|
5
|
+
buf = StringIO.new
|
6
|
+
w = FlameChannelParser::FramecurveWriters::BatchTimewarp.new
|
7
|
+
w.run_export(buf) do | key_writer |
|
8
|
+
key_writer.key(1, 15)
|
9
|
+
key_writer.key(15, 50)
|
10
|
+
key_writer.key(19, 102)
|
11
|
+
end
|
12
|
+
|
13
|
+
File.open(File.dirname(__FILE__) + "/timewarp_export_samples/BatchTW.timewarp_node", "wb"){|f| f.write(buf.string) }
|
14
|
+
|
15
|
+
assert_same_buffer File.open(File.dirname(__FILE__) + "/timewarp_export_samples/BatchTW.timewarp_node"), buf
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/test/test_channel.rb
CHANGED