flame_channel_parser 3.0.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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