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
# @param [String,IO] bin binary data
# @param [String] name Asset name
# @param [String] resource resource data
# @param [String] res_s resS data
# @param [Mikunyan::AssetBundle] parent_bundle Parent AssetBundle
# @return [Mikunyan::Asset] deserialized Asset object
def self.load(bin, name, resource = nil, res_s = nil)
r = Asset.new(name, resource, res_s)
def self.load(bin, name, parent_bundle = nil)
r = Asset.new(name, parent_bundle)
r.send(:load, bin)
r
end
@@ -151,11 +150,11 @@ module Mikunyan
private
def initialize(name, resource = nil, res_s = nil)
# @param [Mikunyan::AssetBundle] bundle
def initialize(name, bundle = nil)
@name = name
@endian = :big
@resource = resource
@res_s = res_s
@bundle = bundle
end
def load(bin)
@@ -292,12 +291,7 @@ module Mikunyan
else
ret.attr = children.map{|c| [c.name, parse_object_private(br, c)]}.to_h
if node.type == 'StreamingInfo'
ret.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
ret.value = get_stream_blob(ret['path'].value, ret['offset'].value, ret['size'].value)
else
ret.is_struct = true
end
@@ -305,5 +299,12 @@ module Mikunyan
br.align(4) if node.need_align?
ret
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
+1 -2
View File
@@ -116,8 +116,7 @@ module Mikunyan
def process_asset_entries(asset_entries)
@blobs = asset_entries.select(&:blob?).map{|e| [e.name, e.data]}.to_h
@assets = asset_entries.reject(&:blob?).map do |e|
basename = split_name(e.name)[0]
Asset.load(e.data, e.name, @blobs["#{basename}.resource"], @blobs["#{basename}.resS"])
Asset.load(e.data, e.name, self)
end
end