From 3f9256ce81d5615cc4ef5ee984e8c2de72a1b054 Mon Sep 17 00:00:00 2001 From: Ishotihadus Date: Thu, 19 Dec 2019 02:01:42 +0900 Subject: [PATCH] fix handling of streaming assets --- lib/mikunyan/asset.rb | 27 ++++++++++++++------------- lib/mikunyan/asset_bundle.rb | 3 +-- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/lib/mikunyan/asset.rb b/lib/mikunyan/asset.rb index 32a05eb..d9de063 100644 --- a/lib/mikunyan/asset.rb +++ b/lib/mikunyan/asset.rb @@ -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 diff --git a/lib/mikunyan/asset_bundle.rb b/lib/mikunyan/asset_bundle.rb index a0db924..d285a23 100644 --- a/lib/mikunyan/asset_bundle.rb +++ b/lib/mikunyan/asset_bundle.rb @@ -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