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