Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 823ef428c1 | |||
| 67b4d1a2e7 | |||
| f13188f812 | |||
| 64d308402d | |||
| 6b477a6b92 |
+8
-3
@@ -2,7 +2,12 @@
|
||||
require 'mikunyan'
|
||||
require 'mikunyan/decoders'
|
||||
require 'fileutils'
|
||||
require 'json'
|
||||
begin
|
||||
require 'usamin'
|
||||
require 'usamin/overwrite'
|
||||
rescue LoadError
|
||||
require 'json'
|
||||
end
|
||||
|
||||
opts = {:as_asset => false, :outputdir => nil, :sprite => false, :pretty => false}
|
||||
arg = nil
|
||||
@@ -63,8 +68,8 @@ assets.each do |asset|
|
||||
unless textures[tex_id]
|
||||
tex_obj = asset.parse_object(tex_id)
|
||||
if tex_obj
|
||||
textures[tex_id] = Mikunyan::ImageDecoder.decode_object(tex_obj) if tex_obj
|
||||
json[tex_id] = {:name => tex_obj.m_Name.value, :width => textures[tex_id].width, :height => textures[tex_id].height, :path_id => tex_id, :sprites => []}
|
||||
textures[tex_id] = Mikunyan::ImageDecoder.decode_object(tex_obj)
|
||||
json[tex_id] = {:name => tex_obj.m_Name.value, :width => textures[tex_id].width, :height => textures[tex_id].height, :path_id => tex_id, :sprites => []} if textures[tex_id]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
+6
-1
@@ -74,7 +74,12 @@ if opts[:yaml]
|
||||
require 'yaml'
|
||||
puts YAML.dump(assets)
|
||||
else
|
||||
require 'json'
|
||||
begin
|
||||
require 'usamin'
|
||||
require 'usamin/overwrite'
|
||||
rescue LoadError
|
||||
require 'json'
|
||||
end
|
||||
assets = assets.map{|k, v| [k, obj64(v)]}.to_h
|
||||
if opts[:pretty]
|
||||
puts JSON.pretty_generate(assets)
|
||||
|
||||
@@ -158,8 +158,8 @@ static inline void decode_etc2_block(const uint8_t *data, uint32_t *outbuf) {
|
||||
c[2][0] = data[5] << 5 & 0xe0 | data[6] >> 3 & 0x1c | data[5] >> 1 & 3;
|
||||
c[2][1] = data[6] << 3 & 0xf8 | data[7] >> 5 & 0x6 | data[6] >> 4 & 1;
|
||||
c[2][2] = data[7] << 2 | data[7] >> 4 & 3;
|
||||
for (int x = 3, i = 0; x >= 0; x--) {
|
||||
for (int y = 3; y >= 0; y--, i++) {
|
||||
for (int y = 0, i = 0; y < 4; y++) {
|
||||
for (int x = 0; x < 4; x++, i++) {
|
||||
uint8_t r = clamp((x * (c[1][0] - c[0][0]) + y * (c[2][0] - c[0][0]) + 4 * c[0][0] + 2) >> 2);
|
||||
uint8_t g = clamp((x * (c[1][1] - c[0][1]) + y * (c[2][1] - c[0][1]) + 4 * c[0][1] + 2) >> 2);
|
||||
uint8_t b = clamp((x * (c[1][2] - c[0][2]) + y * (c[2][2] - c[0][2]) + 4 * c[0][2] + 2) >> 2);
|
||||
|
||||
@@ -10,7 +10,7 @@ module Mikunyan
|
||||
# @attr_reader [Array<Integer>] add_ids ?
|
||||
# @attr_reader [Array<Mikunyan::Asset::Reference>] references reference data
|
||||
class Asset
|
||||
attr_reader :name, :format, :generator_version, :target_platform, :endian, :klasses, :objects, :add_ids, :references
|
||||
attr_reader :name, :format, :generator_version, :target_platform, :endian, :klasses, :objects, :add_ids, :references, :res_s
|
||||
|
||||
# Struct for representing Asset class definition
|
||||
# @attr [Integer] class_id class ID
|
||||
@@ -40,9 +40,10 @@ module Mikunyan
|
||||
# Load Asset from binary string
|
||||
# @param [String] bin binary data
|
||||
# @param [String] name Asset name
|
||||
# @param [String] res_s resS data
|
||||
# @return [Mikunyan::Asset] deserialized Asset object
|
||||
def self.load(bin, name)
|
||||
r = Asset.new(name)
|
||||
def self.load(bin, name, res_s = nil)
|
||||
r = Asset.new(name, res_s)
|
||||
r.send(:load, bin)
|
||||
r
|
||||
end
|
||||
@@ -123,9 +124,10 @@ module Mikunyan
|
||||
|
||||
private
|
||||
|
||||
def initialize(name)
|
||||
def initialize(name, res_s = nil)
|
||||
@name = name
|
||||
@endian = :big
|
||||
@res_s = res_s
|
||||
end
|
||||
|
||||
def load(bin)
|
||||
@@ -245,6 +247,9 @@ module Mikunyan
|
||||
else
|
||||
r.value = parse_object_private(br, children[0]).value
|
||||
end
|
||||
elsif node.type == 'StreamingInfo'
|
||||
children.each{|child| r[child[:name]] = parse_object_private(br, child)}
|
||||
r.value = @res_s.byteslice(r['offset'].value, r['size'].value) if r['path'].value == "archive:/#{name}/#{name}.resS"
|
||||
else
|
||||
children.each do |child|
|
||||
r[child[:name]] = parse_object_private(br, child)
|
||||
|
||||
@@ -84,11 +84,13 @@ module Mikunyan
|
||||
asset_count = head.i32u
|
||||
asset_count.times{ asset_blocks << {:offset => head.i64u, :size => head.i64u, :status => head.i32, :name => head.cstr} }
|
||||
|
||||
raw_data = ''
|
||||
raw_data = String.new
|
||||
blocks.each{|b| raw_data << uncompress(br.read(b[:c]), b[:u], b[:f])}
|
||||
|
||||
asset_blocks.each do |b|
|
||||
asset = Asset.load(raw_data.byteslice(b[:offset], b[:size]), b[:name])
|
||||
next if b[:name].end_with?('.resS')
|
||||
res_s = asset_blocks.find{|e| e[:name] == "#{b[:name]}.resS"}
|
||||
asset = Asset.load(raw_data.byteslice(b[:offset], b[:size]), b[:name], res_s && raw_data.byteslice(res_s[:offset], res_s[:size]))
|
||||
@assets << asset
|
||||
end
|
||||
end
|
||||
|
||||
@@ -23,6 +23,11 @@ module Mikunyan
|
||||
bin = bin.value
|
||||
fmt = fmt.value
|
||||
|
||||
if bin.size == 0 && object['m_StreamData']
|
||||
bin = object['m_StreamData'].value
|
||||
return nil unless bin
|
||||
end
|
||||
|
||||
case fmt
|
||||
when 1
|
||||
decode_a8(width, height, bin)
|
||||
|
||||
@@ -22,7 +22,8 @@ module Mikunyan
|
||||
node_count = br.i32u
|
||||
buffer_size = br.i32u
|
||||
node_count.times do
|
||||
nodes << Node.new(br.i16u, br.i8u, br.i8u != 0, br.i32, br.i32, br.i32, br.i32u, br.i32u)
|
||||
node = Node.new(br.i16u, br.i8u, br.i8u != 0, br.i32, br.i32, br.i32, br.i32u, br.i32u)
|
||||
nodes << node
|
||||
end
|
||||
buffer = br.read(buffer_size)
|
||||
nodes.each do |n|
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
module Mikunyan
|
||||
# version string
|
||||
VERSION = "3.9.5"
|
||||
VERSION = "3.9.6"
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user