#!/usr/bin/env ruby require 'mikunyan' require 'mikunyan/decoders' require 'fileutils' opts = {:as_asset => false, :outputdir => nil} arg = nil i = 0 while i < ARGV.count if ARGV[i].start_with?('-') case ARGV[i] when '--as-asset', '-a' opts[:as_asset] = true when '--outputdir', '-o' i += 1 opts[:outputdir] = ARGV[i] else warn("Unknown option: #{ARGV[i]}") end else arg = ARGV[i] unless arg end i += 1 end unless arg warn("Input file is not specified") exit(1) end unless File.file?(arg) warn("File not found: #{arg}") exit(1) end assets = [] if opts[:as_asset] assets = [Mikunyan::Asset.file(arg, File.basename(arg, '.*'))] else assets = Mikunyan::AssetBundle.file(arg).assets end outdir = opts[:outputdir] || File.basename(arg, '.*') FileUtils.mkpath(outdir) assets.each do |asset| asset.path_ids.select{|path_id| asset.object_type(path_id) == 'Texture2D'}.each do |path_id| obj = asset.parse_object(path_id) name = obj.m_Name.value image = Mikunyan::ImageDecoder.decode_object(obj) puts "#{outdir}/#{name}.png (#{image.width} x #{image.height})" image.save("#{outdir}/#{name}.png") if image end end