flame_channel_parser 4.1.1 → 4.2.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.
- checksums.yaml +4 -4
- data/Gemfile +3 -0
- data/History.txt +8 -0
- data/flame_channel_parser.gemspec +5 -5
- data/lib/builder.rb +3 -2
- data/lib/extractor.rb +2 -2
- data/lib/flame_channel_parser/version.rb +1 -1
- data/lib/flame_channel_parser.rb +2 -7
- data/lib/framecurve_writers/base.rb +6 -4
- data/lib/framecurve_writers/batch_timewarp.rb +3 -2
- data/lib/framecurve_writers/kronos.rb +3 -2
- data/lib/framecurve_writers/softfx_timewarp.rb +2 -1
- data/lib/interpolator.rb +1 -0
- data/lib/parser.rb +1 -0
- data/lib/segments.rb +2 -1
- data/lib/timewarp_extractor.rb +1 -0
- data/lib/xml_parser.rb +2 -6
- data/test/test_ractor.rb +30 -0
- metadata +41 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2f724511488b65ce62f27bdd5196fb18b0ab00559f6f3355c4ab156e009d3ae0
|
|
4
|
+
data.tar.gz: d12b7ffcee90ce9dfca4f09177dc42fa9664dd38d98282a4ed60d040699538bc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8cb8446d91eb42275d8c295d9f06596c99928886c8e2b53ac8382d6e3738a377c97e31547d022840b9868366c0e0a26b0047818f5e8bde23be47fc37e0533562
|
|
7
|
+
data.tar.gz: 3d6c07df92674dea3df971a8a18449ce48e6256ee9d2dad4e1d36be11618cb11caa228bb567c825fb95998aa2aa4ceba707c6285b0c526075b6295fff2b70fa2
|
data/Gemfile
CHANGED
data/History.txt
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
=== 4.2.0 / 2026-10-02
|
|
2
|
+
|
|
3
|
+
* Make parsing, interpolation and Builder usable from within Ractors (Ruby 4.0+)
|
|
4
|
+
* Fix `FlameChannelParser.parse`, `XMLParser#parse` and the framecurve writers on Ruby 3+
|
|
5
|
+
(`Proc.new` without a block)
|
|
6
|
+
* Declare the dependencies on `matrix` and `rexml`, which are no longer default gems
|
|
7
|
+
* Require framecurve 2.2.4+
|
|
8
|
+
|
|
1
9
|
=== 4.1.0 / 2014-10-20
|
|
2
10
|
|
|
3
11
|
* Adds `flame_channel_inspect` for examining Flame setups
|
|
@@ -4,12 +4,12 @@ Gem::Specification.new do |s|
|
|
|
4
4
|
s.name = "flame_channel_parser"
|
|
5
5
|
s.version = FlameChannelParser::VERSION
|
|
6
6
|
|
|
7
|
-
s.
|
|
7
|
+
s.required_ruby_version = ">= 2.6"
|
|
8
8
|
s.authors = ["Julik Tarkhanov"]
|
|
9
9
|
s.date = Time.now.utc.strftime("%Y-%m-%d")
|
|
10
10
|
s.description = "Reads and interpolates animation channels in IFFS setups"
|
|
11
11
|
s.email = "me@julik.nl"
|
|
12
|
-
s.executables = ["
|
|
12
|
+
s.executables = Dir["bin/*"].map { |f| File.basename(f) }
|
|
13
13
|
s.extra_rdoc_files = [
|
|
14
14
|
"README.md"
|
|
15
15
|
]
|
|
@@ -17,12 +17,12 @@ Gem::Specification.new do |s|
|
|
|
17
17
|
s.homepage = "http://guerilla-di.org/flame-channel-parser/"
|
|
18
18
|
s.licenses = ["MIT"]
|
|
19
19
|
s.require_paths = ["lib"]
|
|
20
|
-
s.rubygems_version = "1.8.11"
|
|
21
20
|
s.summary = "A parser/interpolator for Flame/Smoke animation curves"
|
|
22
21
|
|
|
23
|
-
s.specification_version = 3
|
|
24
22
|
s.add_runtime_dependency("update_hints", ["~> 1.0"])
|
|
25
|
-
s.add_runtime_dependency("framecurve", ["~> 2"])
|
|
23
|
+
s.add_runtime_dependency("framecurve", ["~> 2", ">= 2.2.4"])
|
|
24
|
+
s.add_runtime_dependency("matrix")
|
|
25
|
+
s.add_runtime_dependency("rexml")
|
|
26
26
|
s.add_development_dependency("rake", [">= 0"])
|
|
27
27
|
s.add_development_dependency("cli_test", ["~> 1.0"])
|
|
28
28
|
s.add_development_dependency("test-unit")
|
data/lib/builder.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# shareable_constant_value: literal
|
|
1
2
|
# A Builder-like class for exporting Flame setups
|
|
2
3
|
class FlameChannelParser::Builder #< BasicObject
|
|
3
4
|
INDENT = "\t"
|
|
@@ -67,8 +68,8 @@ class FlameChannelParser::Builder #< BasicObject
|
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
def __camelize(s)
|
|
70
|
-
|
|
71
|
-
|
|
71
|
+
@camelizations ||= {}
|
|
72
|
+
@camelizations[s] ||= s.to_s.gsub(/(^|_)(.)/) { $2.upcase }
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
def __flameize(v)
|
data/lib/extractor.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# shareable_constant_value: literal
|
|
1
2
|
# Extracts and bakes a specific animation channel to a given buffer, one string per frame
|
|
2
3
|
class FlameChannelParser::Extractor
|
|
3
4
|
|
|
@@ -27,7 +28,7 @@ class FlameChannelParser::Extractor
|
|
|
27
28
|
end
|
|
28
29
|
|
|
29
30
|
def extract(path, options)
|
|
30
|
-
options = DEFAULTS.
|
|
31
|
+
options = DEFAULTS.merge(:destination => $stdout).merge(options)
|
|
31
32
|
File.open(path) do |f|
|
|
32
33
|
|
|
33
34
|
# Then parse
|
|
@@ -47,7 +48,6 @@ class FlameChannelParser::Extractor
|
|
|
47
48
|
|
|
48
49
|
DEFAULT_START_FRAME = 1
|
|
49
50
|
DEFAULTS = {
|
|
50
|
-
:destination => $stdout,
|
|
51
51
|
:start_frame => nil,
|
|
52
52
|
:end_frame => nil,
|
|
53
53
|
:channel => DEFAULT_CHANNEL_TO_EXTRACT,
|
data/lib/flame_channel_parser.rb
CHANGED
|
@@ -7,13 +7,8 @@ module FlameChannelParser
|
|
|
7
7
|
# Parse a Flame setup into an array of Channel objects.
|
|
8
8
|
# If a block is given to the method it will yield Channel
|
|
9
9
|
# objects one by one instead of accumulating them into an array (useful for big setups)
|
|
10
|
-
def self.parse(io)
|
|
11
|
-
|
|
12
|
-
if block_given?
|
|
13
|
-
c.new.parse(io, &Proc.new)
|
|
14
|
-
else
|
|
15
|
-
c.new.parse(io)
|
|
16
|
-
end
|
|
10
|
+
def self.parse(io, &blk)
|
|
11
|
+
get_parser_class(io).new.parse(io, &blk)
|
|
17
12
|
end
|
|
18
13
|
|
|
19
14
|
# Parse a Flame setup at passed path. Will return the channels instead of yielding them
|
|
@@ -12,14 +12,16 @@ class FlameChannelParser::FramecurveWriters::Base
|
|
|
12
12
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
+
# Kept as a frozen array in a class-level ivar so that it can be read from non-main Ractors
|
|
15
16
|
def self.inherited(by)
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
writers = FlameChannelParser::FramecurveWriters::Base.instance_variable_get(:@writers) || []
|
|
18
|
+
FlameChannelParser::FramecurveWriters::Base.instance_variable_set(:@writers, (writers + [by]).freeze)
|
|
19
|
+
super
|
|
18
20
|
end
|
|
19
21
|
|
|
20
22
|
# Yields each defined writer class to the block
|
|
21
|
-
def self.with_each_writer
|
|
22
|
-
|
|
23
|
+
def self.with_each_writer(&blk)
|
|
24
|
+
FlameChannelParser::FramecurveWriters::Base.instance_variable_get(:@writers).each(&blk)
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
# Should return the desired extension for the exported file
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
# shareable_constant_value: literal
|
|
1
2
|
# Writes out a Batch timewarp node setup
|
|
2
3
|
class FlameChannelParser::FramecurveWriters::BatchTimewarp < FlameChannelParser::FramecurveWriters::SoftfxTimewarp
|
|
3
4
|
|
|
4
|
-
TEMPLATE = File.dirname(__FILE__) + "/templates/BatchTW.xml"
|
|
5
|
-
TEMPLATE_KEY = File.dirname(__FILE__) + "/templates/key.xml"
|
|
5
|
+
TEMPLATE = (File.dirname(__FILE__) + "/templates/BatchTW.xml").freeze
|
|
6
|
+
TEMPLATE_KEY = (File.dirname(__FILE__) + "/templates/key.xml").freeze
|
|
6
7
|
|
|
7
8
|
def self.extension
|
|
8
9
|
'.timewarp_node'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
# shareable_constant_value: literal
|
|
1
2
|
# Writes out a framecurve setup
|
|
2
3
|
class FlameChannelParser::FramecurveWriters::Kronos < FlameChannelParser::FramecurveWriters::SoftfxTimewarp
|
|
3
|
-
TOKEN = Regexp.new('__INSERT_FRAME_ANIM__')
|
|
4
|
-
TEMPLATE = File.dirname(__FILE__) + "/templates/SampleKronos.F_Kronos"
|
|
4
|
+
TOKEN = Regexp.new('__INSERT_FRAME_ANIM__').freeze
|
|
5
|
+
TEMPLATE = (File.dirname(__FILE__) + "/templates/SampleKronos.F_Kronos").freeze
|
|
5
6
|
|
|
6
7
|
def self.extension
|
|
7
8
|
'.F_Kronos'
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
# shareable_constant_value: literal
|
|
1
2
|
# Writes out a framecurve setup
|
|
2
3
|
class FlameChannelParser::FramecurveWriters::SoftfxTimewarp < FlameChannelParser::FramecurveWriters::Base
|
|
3
4
|
DATETIME_FORMAT = '%a %b %d %H:%M:%S %Y'
|
|
4
|
-
TIME = Time.local(2011,12,28,14,50,05)
|
|
5
|
+
TIME = Time.local(2011,12,28,14,50,05).freeze
|
|
5
6
|
|
|
6
7
|
def self.extension
|
|
7
8
|
'.timewarp'
|
data/lib/interpolator.rb
CHANGED
data/lib/parser.rb
CHANGED
data/lib/segments.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# shareable_constant_value: literal
|
|
1
2
|
require "matrix"
|
|
2
3
|
|
|
3
4
|
module FlameChannelParser::Segments #:nodoc:
|
|
@@ -52,7 +53,7 @@ module FlameChannelParser::Segments #:nodoc:
|
|
|
52
53
|
[-2, 3, 0, 0],
|
|
53
54
|
[1, -2, 1, 0],
|
|
54
55
|
[1, -1, 0, 0]
|
|
55
|
-
].transpose
|
|
56
|
+
].transpose.freeze
|
|
56
57
|
|
|
57
58
|
def initialize(from_frame, to_frame, value1, value2, tangent1, tangent2)
|
|
58
59
|
|
data/lib/timewarp_extractor.rb
CHANGED
data/lib/xml_parser.rb
CHANGED
|
@@ -73,17 +73,13 @@ class FlameChannelParser::XMLParser < FlameChannelParser::Parser
|
|
|
73
73
|
|
|
74
74
|
# Parses the setup passed in the IO. If a block is given to the method it will yield Channel
|
|
75
75
|
# objects one by one instead of accumulating them into an array (useful for big setups)
|
|
76
|
-
def parse(io)
|
|
76
|
+
def parse(io, &blk)
|
|
77
77
|
# Ok this is gothic BUT needed. What we do is we transform the XML setup into the OLD
|
|
78
78
|
# setup format, after which we run it through the OLD parser all the same.
|
|
79
79
|
# I am almost sure that ADSK does the same.
|
|
80
80
|
t = Tempfile.new("bx")
|
|
81
81
|
REXML::Document.parse_stream(io, XMLToSetup.new(t))
|
|
82
82
|
t.rewind
|
|
83
|
-
|
|
84
|
-
super(t, &Proc.new)
|
|
85
|
-
else
|
|
86
|
-
super(t)
|
|
87
|
-
end
|
|
83
|
+
super(t, &blk)
|
|
88
84
|
end
|
|
89
85
|
end
|
data/test/test_ractor.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "helper"
|
|
2
|
+
|
|
3
|
+
class TestRactor < Test::Unit::TestCase
|
|
4
|
+
def test_parses_interpolates_and_builds_inside_a_ractor
|
|
5
|
+
omit "Needs Ruby 4.0+ Ractors" unless defined?(Ractor) && Ractor.method_defined?(:value)
|
|
6
|
+
|
|
7
|
+
path = File.dirname(__FILE__) + "/snaps/FLEM_curves_example.action"
|
|
8
|
+
expected = run_conversion(path)
|
|
9
|
+
|
|
10
|
+
experimental_warnings, Warning[:experimental] = Warning[:experimental], false
|
|
11
|
+
begin
|
|
12
|
+
from_ractor = Ractor.new(path) { |p| TestRactor.new("ractor").run_conversion(p) }.value
|
|
13
|
+
assert_equal expected, from_ractor
|
|
14
|
+
ensure
|
|
15
|
+
Warning[:experimental] = experimental_warnings
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def run_conversion(path)
|
|
20
|
+
channels = File.open(path, "rb") { |f| FlameChannelParser.parse(f) }
|
|
21
|
+
values = channels.reject(&:empty?).map do |channel|
|
|
22
|
+
interpolator = FlameChannelParser::Interpolator.new(channel)
|
|
23
|
+
(1..20).map { |frame| interpolator.sample_at(frame) }
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
out = StringIO.new
|
|
27
|
+
FlameChannelParser::Builder.new(out).write_block!("Channel", "foo") { |b| b.some_value 1.0 }
|
|
28
|
+
[values, out.string]
|
|
29
|
+
end
|
|
30
|
+
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: flame_channel_parser
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.
|
|
4
|
+
version: 4.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Julik Tarkhanov
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 2026-10-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: update_hints
|
|
@@ -31,6 +30,9 @@ dependencies:
|
|
|
31
30
|
- - "~>"
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
32
|
version: '2'
|
|
33
|
+
- - ">="
|
|
34
|
+
- !ruby/object:Gem::Version
|
|
35
|
+
version: 2.2.4
|
|
34
36
|
type: :runtime
|
|
35
37
|
prerelease: false
|
|
36
38
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -38,6 +40,37 @@ dependencies:
|
|
|
38
40
|
- - "~>"
|
|
39
41
|
- !ruby/object:Gem::Version
|
|
40
42
|
version: '2'
|
|
43
|
+
- - ">="
|
|
44
|
+
- !ruby/object:Gem::Version
|
|
45
|
+
version: 2.2.4
|
|
46
|
+
- !ruby/object:Gem::Dependency
|
|
47
|
+
name: matrix
|
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
|
49
|
+
requirements:
|
|
50
|
+
- - ">="
|
|
51
|
+
- !ruby/object:Gem::Version
|
|
52
|
+
version: '0'
|
|
53
|
+
type: :runtime
|
|
54
|
+
prerelease: false
|
|
55
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '0'
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: rexml
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - ">="
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '0'
|
|
67
|
+
type: :runtime
|
|
68
|
+
prerelease: false
|
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
70
|
+
requirements:
|
|
71
|
+
- - ">="
|
|
72
|
+
- !ruby/object:Gem::Version
|
|
73
|
+
version: '0'
|
|
41
74
|
- !ruby/object:Gem::Dependency
|
|
42
75
|
name: rake
|
|
43
76
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -84,6 +117,7 @@ description: Reads and interpolates animation channels in IFFS setups
|
|
|
84
117
|
email: me@julik.nl
|
|
85
118
|
executables:
|
|
86
119
|
- bake_flame_channel
|
|
120
|
+
- flame_channel_inspect
|
|
87
121
|
- framecurve_from_flame
|
|
88
122
|
- framecurve_to_flame
|
|
89
123
|
extensions: []
|
|
@@ -163,6 +197,7 @@ files:
|
|
|
163
197
|
- test/test_interpolator.rb
|
|
164
198
|
- test/test_key.rb
|
|
165
199
|
- test/test_kronos_timewarp_writer.rb
|
|
200
|
+
- test/test_ractor.rb
|
|
166
201
|
- test/test_segments.rb
|
|
167
202
|
- test/test_softfx_timewarp_writer.rb
|
|
168
203
|
- test/test_timewarp_extractor.rb
|
|
@@ -182,7 +217,6 @@ homepage: http://guerilla-di.org/flame-channel-parser/
|
|
|
182
217
|
licenses:
|
|
183
218
|
- MIT
|
|
184
219
|
metadata: {}
|
|
185
|
-
post_install_message:
|
|
186
220
|
rdoc_options: []
|
|
187
221
|
require_paths:
|
|
188
222
|
- lib
|
|
@@ -190,16 +224,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
190
224
|
requirements:
|
|
191
225
|
- - ">="
|
|
192
226
|
- !ruby/object:Gem::Version
|
|
193
|
-
version: '
|
|
227
|
+
version: '2.6'
|
|
194
228
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
195
229
|
requirements:
|
|
196
230
|
- - ">="
|
|
197
231
|
- !ruby/object:Gem::Version
|
|
198
232
|
version: '0'
|
|
199
233
|
requirements: []
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
signing_key:
|
|
203
|
-
specification_version: 3
|
|
234
|
+
rubygems_version: 4.0.3
|
|
235
|
+
specification_version: 4
|
|
204
236
|
summary: A parser/interpolator for Flame/Smoke animation curves
|
|
205
237
|
test_files: []
|