fix handling of streaming assets
This commit is contained in:
+14
-13
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user