diff --git a/exe/mikunyan-image b/exe/mikunyan-image new file mode 100755 index 0000000..97df628 --- /dev/null +++ b/exe/mikunyan-image @@ -0,0 +1,55 @@ +#!/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