fix handling of streaming assets

This commit is contained in:
Ishotihadus
2019-12-19 02:01:42 +09:00
parent 39ae15d9aa
commit 3f9256ce81
2 changed files with 15 additions and 15 deletions
+14 -13
View File
@@ -76,11 +76,10 @@ module Mikunyan
# Load Asset from binary string # Load Asset from binary string
# @param [String,IO] bin binary data # @param [String,IO] bin binary data
# @param [String] name Asset name # @param [String] name Asset name
# @param [String] resource resource data # @param [Mikunyan::AssetBundle] parent_bundle Parent AssetBundle
# @param [String] res_s resS data
# @return [Mikunyan::Asset] deserialized Asset object # @return [Mikunyan::Asset] deserialized Asset object
def self.load(bin, name, resource = nil, res_s = nil) def self.load(bin, name, parent_bundle = nil)
r = Asset.new(name, resource, res_s) r = Asset.new(name, parent_bundle)
r.send(:load, bin) r.send(:load, bin)
r r
end end
@@ -151,11 +150,11 @@ module Mikunyan
private private
def initialize(name, resource = nil, res_s = nil) # @param [Mikunyan::AssetBundle] bundle
def initialize(name, bundle = nil)
@name = name @name = name
@endian = :big @endian = :big
@resource = resource @bundle = bundle
@res_s = res_s
end end
def load(bin) def load(bin)
@@ -292,12 +291,7 @@ module Mikunyan
else else
ret.attr = children.map{|c| [c.name, parse_object_private(br, c)]}.to_h ret.attr = children.map{|c| [c.name, parse_object_private(br, c)]}.to_h
if node.type == 'StreamingInfo' if node.type == 'StreamingInfo'
ret.value = ret.value = get_stream_blob(ret['path'].value, ret['offset'].value, ret['size'].value)
if ret['path'].value == "archive:/#{name}/#{name}.resource"
@resource&.byteslice(ret['offset'].value, ret['size'].value)
elsif ret['path'].value == "archive:/#{name}/#{name}.resS"
@res_s&.byteslice(ret['offset'].value, ret['size'].value)
end
else else
ret.is_struct = true ret.is_struct = true
end end
@@ -305,5 +299,12 @@ module Mikunyan
br.align(4) if node.need_align? br.align(4) if node.need_align?
ret ret
end end
def get_stream_blob(path, offset, size)
return nil unless path && @bundle
return nil if path.empty?
path["archive:/#{@name}/"] = '' if path.start_with?("archive:/#{@name}/")
@bundle.blobs[path]&.byteslice(offset, size)
end
end end
end end
+1 -2
View File
@@ -116,8 +116,7 @@ module Mikunyan
def process_asset_entries(asset_entries) def process_asset_entries(asset_entries)
@blobs = asset_entries.select(&:blob?).map{|e| [e.name, e.data]}.to_h @blobs = asset_entries.select(&:blob?).map{|e| [e.name, e.data]}.to_h
@assets = asset_entries.reject(&:blob?).map do |e| @assets = asset_entries.reject(&:blob?).map do |e|
basename = split_name(e.name)[0] Asset.load(e.data, e.name, self)
Asset.load(e.data, e.name, @blobs["#{basename}.resource"], @blobs["#{basename}.resS"])
end end
end end