mikunyan 3.9.3 → 3.9.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: f06ec3ed2d2eaaea9e59be6ff6ffa0622e2b20b6
4
- data.tar.gz: c293990ac585f20bdd3ee041367fb6b92ba26a05
2
+ SHA256:
3
+ metadata.gz: 3fa0e08afb0e0451f374cf94e9980f6f3b2a7ad279440b8d7d4e8a26426384f6
4
+ data.tar.gz: 31032deca5a1c100086c78c67a3c3b3bc899b66d08c97ab12fcb19980a2e70f3
5
5
  SHA512:
6
- metadata.gz: 0511ea6b9a57d4623946497a5485f4c31b5f63094d8087f5e432cf63987866c2a48e7fb795472fe1d0929f0f423fa5635f5464632016560db40d2417ba0c55ec
7
- data.tar.gz: 85628047ca5c0ab33497ec82eac07992fde156352fec1afa6fc2eeb8c9a698dc205b1fac7d4b10183a72f3386bb045e60661ccf7738ca1d4de33044ad790ea36
6
+ metadata.gz: 7bb6fdd93d68c6816d37f8cc6ab988672b2b2b6eab969faa71d79e98261e79c4a0376ab5d2989895537d54985426c1269eda763d13e9b73a452b72d7d626e3bc
7
+ data.tar.gz: 8f9816d0bdf13fb919257c853f45591a2e668d89c0800387d00ff778b567071187982d861cbffeb3b11930dc19be9ebb5c08de5e0e0d091b530f80692966a9e4
data/README.md CHANGED
@@ -121,7 +121,7 @@ img.save('mikunyan.png')
121
121
 
122
122
  Mikunyan cannot decode ASTC with HDR data. Use `Mikunyan::ImageDecoder.create_astc_file` instead.
123
123
 
124
- ### Json / YAML Outputer
124
+ ### Json / YAML Outputter
125
125
 
126
126
  `mikunyan-json` is an executable command for converting unity3d to json.
127
127
 
@@ -130,9 +130,96 @@ Mikunyan cannot decode ASTC with HDR data. Use `Mikunyan::ImageDecoder.create_as
130
130
  Available options:
131
131
 
132
132
  - `--as-asset` (`-a`): interpret input file as not AssetBudnle but Asset
133
- - `--pretty` (`-p`): prettify output json (`mikunyan-json` only)
133
+ - `--pretty` (`-p`): prettify output json
134
134
  - `--yaml` (`-y`): YAML mode
135
135
 
136
+ ### Image Outputter
137
+
138
+ `mikunyan-image` is an executable command for unpacking images from unity3d.
139
+
140
+ $ mikunyan-image bundle.unity3d
141
+
142
+ The console log is json data of output textures as below.
143
+
144
+ ```json
145
+ [
146
+ {
147
+ "name": "bg_b",
148
+ "width": 1024,
149
+ "height": 1024,
150
+ "path_id": -744818715421265689
151
+ },
152
+ {
153
+ "name": "bg_a",
154
+ "width": 1024,
155
+ "height": 1024,
156
+ "path_id": 5562124901460497987
157
+ }
158
+ ]
159
+ ```
160
+
161
+ If the option `--sprite` specified, `mikunyan-image` will output sprites. The log json also contains sprite information.
162
+
163
+ ```json
164
+ [
165
+ {
166
+ "name": "bg_a",
167
+ "width": 1024,
168
+ "height": 1024,
169
+ "path_id": 5562124901460497987,
170
+ "sprites": [
171
+ {
172
+ "name": "bg_a_0",
173
+ "x": 1.0,
174
+ "y": 303.0,
175
+ "width": 1022.0,
176
+ "height": 720.0,
177
+ "path_id": -7546240288260780845
178
+ },
179
+ {
180
+ "name": "bg_a_1",
181
+ "x": 1.0,
182
+ "y": 1.0,
183
+ "width": 720.0,
184
+ "height": 258.0,
185
+ "path_id": -5293490190204738553
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "name": "bg_b",
191
+ "width": 1024,
192
+ "height": 1024,
193
+ "path_id": -744818715421265689,
194
+ "sprites": [
195
+ {
196
+ "name": "bg_b_1",
197
+ "x": 1.0,
198
+ "y": 1.0,
199
+ "width": 720.0,
200
+ "height": 258.0,
201
+ "path_id": 4884595733995530103
202
+ },
203
+ {
204
+ "name": "bg_b_0",
205
+ "x": 1.0,
206
+ "y": 303.0,
207
+ "width": 1022.0,
208
+ "height": 720.0,
209
+ "path_id": 7736251300187116441
210
+ }
211
+ ]
212
+ }
213
+ ]
214
+ ```
215
+
216
+ Available options:
217
+
218
+ - `--as-asset` (`-a`): interpret input file as not AssetBudnle but Asset
219
+ - `--outputdir` (`-o`): output directory (default is a basename of input file without an extention)
220
+ - `--sprite` (`-s`): output sprites instead of textures
221
+ - `--pretty` (`-p`): prettify output json
222
+
136
223
  ## Dependencies
137
224
 
138
225
  - [json](https://rubygems.org/gems/json)
@@ -0,0 +1,92 @@
1
+ #!/usr/bin/env ruby
2
+ require 'mikunyan'
3
+ require 'mikunyan/decoders'
4
+ require 'fileutils'
5
+ require 'json'
6
+
7
+ opts = {:as_asset => false, :outputdir => nil, :sprite => false, :pretty => false}
8
+ arg = nil
9
+ i = 0
10
+ while i < ARGV.count
11
+ if ARGV[i].start_with?('-')
12
+ case ARGV[i]
13
+ when '--as-asset', '-a'
14
+ opts[:as_asset] = true
15
+ when '--outputdir', '-o'
16
+ i += 1
17
+ opts[:outputdir] = ARGV[i]
18
+ when '--sprite', '-s'
19
+ opts[:sprite] = true
20
+ when '--pretty', '-p'
21
+ opts[:pretty] = true
22
+ else
23
+ warn("Unknown option: #{ARGV[i]}")
24
+ end
25
+ else
26
+ arg = ARGV[i] unless arg
27
+ end
28
+ i += 1
29
+ end
30
+
31
+ unless arg
32
+ warn("Input file is not specified")
33
+ exit(1)
34
+ end
35
+
36
+ unless File.file?(arg)
37
+ warn("File not found: #{arg}")
38
+ exit(1)
39
+ end
40
+
41
+ assets = []
42
+
43
+ if opts[:as_asset]
44
+ assets = [Mikunyan::Asset.file(arg, File.basename(arg, '.*'))]
45
+ else
46
+ assets = Mikunyan::AssetBundle.file(arg).assets
47
+ end
48
+
49
+ outdir = opts[:outputdir] || File.basename(arg, '.*')
50
+ FileUtils.mkpath(outdir)
51
+
52
+ assets.each do |asset|
53
+ if opts[:sprite]
54
+ json = {}
55
+ textures = {}
56
+
57
+ asset.path_ids.select{|path_id| asset.object_type(path_id) == 'Sprite'}.each do |path_id|
58
+ obj = asset.parse_object(path_id)
59
+ name = obj.m_Name.value
60
+ tex_id = obj.m_RD.texture.m_PathID.value
61
+
62
+ unless textures[tex_id]
63
+ tex_obj = asset.parse_object(tex_id)
64
+ textures[tex_id] = Mikunyan::ImageDecoder.decode_object(tex_obj) if tex_obj
65
+ json[tex_id] = {:name => tex_obj.m_Name.value, :width => textures[tex_id].width, :height => textures[tex_id].height, :path_id => tex_id, :sprites => []}
66
+ end
67
+
68
+ if textures[tex_id]
69
+ x = obj.m_Rect.x.value
70
+ y = obj.m_Rect.y.value
71
+ width = obj.m_Rect.width.value
72
+ height = obj.m_Rect.height.value
73
+
74
+ json[tex_id][:sprites] << {:name => name, :x => x, :y => y, :width => width, :height => height, :path_id => path_id}
75
+ textures[tex_id].crop(x.round, (textures[tex_id].height - height - y).round, width.round, height.round).save("#{outdir}/#{name}.png")
76
+ end
77
+ end
78
+ puts opts[:pretty] ? JSON.pretty_generate(json.values) : JSON.generate(json.values)
79
+ else
80
+ json = []
81
+ asset.path_ids.select{|path_id| asset.object_type(path_id) == 'Texture2D'}.each do |path_id|
82
+ obj = asset.parse_object(path_id)
83
+ name = obj.m_Name.value
84
+ image = Mikunyan::ImageDecoder.decode_object(obj)
85
+ if image
86
+ json << {:name => name, :width => image.width, :height => image.height, :path_id => path_id}
87
+ image.save("#{outdir}/#{name}.png")
88
+ end
89
+ end
90
+ puts opts[:pretty] ? JSON.pretty_generate(json) : JSON.generate(json)
91
+ end
92
+ end
@@ -97,7 +97,7 @@ module Mikunyan
97
97
  c = ((c & 0xf000) << 12) | ((c & 0x0f00) << 8) | ((c & 0x00f0) << 4) | (c & 0x000f)
98
98
  BinUtils.append_int32_be!(mem, c << 4 | c)
99
99
  end
100
- ChunkyPNG::Image.from_rgba_stream(width, height, mem)
100
+ ChunkyPNG::Image.from_rgba_stream(width, height, mem).flip
101
101
  end
102
102
 
103
103
  # Decode image from ARGB4444 binary
@@ -113,7 +113,7 @@ module Mikunyan
113
113
  c = ((c & 0x0f00) << 16) | ((c & 0x00f0) << 12) | ((c & 0x000f) << 8) | ((c & 0xf000) >> 12)
114
114
  BinUtils.append_int32_be!(mem, c << 4 | c)
115
115
  end
116
- ChunkyPNG::Image.from_rgba_stream(width, height, mem)
116
+ ChunkyPNG::Image.from_rgba_stream(width, height, mem).flip
117
117
  end
118
118
 
119
119
  # Decode image from RGB565 binary
@@ -131,7 +131,7 @@ module Mikunyan
131
131
  b = (c & 0x001f) << 3
132
132
  BinUtils.append_int8!(mem, r | r >> 5, g | g >> 6, b | b >> 5)
133
133
  end
134
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
134
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
135
135
  end
136
136
 
137
137
  # Decode image from A8 binary
@@ -145,7 +145,7 @@ module Mikunyan
145
145
  c = BinUtils.get_int8(bin, i)
146
146
  BinUtils.append_int8!(mem, c, c, c)
147
147
  end
148
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
148
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
149
149
  end
150
150
 
151
151
  # Decode image from R8 binary
@@ -154,7 +154,7 @@ module Mikunyan
154
154
  # @param [String] bin binary to decode
155
155
  # @return [ChunkyPNG::Image] decoded image
156
156
  def self.decode_r8(width, height, bin)
157
- decode_a8(width, height, bin)
157
+ decode_a8(width, height, bin).flip
158
158
  end
159
159
 
160
160
  # Decode image from RG16 binary
@@ -167,7 +167,7 @@ module Mikunyan
167
167
  (width * height).times do |i|
168
168
  BinUtils.append_int16_int8_be!(mem, BinUtils.get_int16_be(bin, i*2), 0)
169
169
  end
170
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
170
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
171
171
  end
172
172
 
173
173
  # Decode image from RGB24 binary
@@ -176,7 +176,7 @@ module Mikunyan
176
176
  # @param [String] bin binary to decode
177
177
  # @return [ChunkyPNG::Image] decoded image
178
178
  def self.decode_rgb24(width, height, bin)
179
- ChunkyPNG::Image.from_rgb_stream(width, height, bin)
179
+ ChunkyPNG::Image.from_rgb_stream(width, height, bin).flip
180
180
  end
181
181
 
182
182
  # Decode image from RGBA32 binary
@@ -185,7 +185,7 @@ module Mikunyan
185
185
  # @param [String] bin binary to decode
186
186
  # @return [ChunkyPNG::Image] decoded image
187
187
  def self.decode_rgba32(width, height, bin)
188
- ChunkyPNG::Image.from_rgba_stream(width, height, bin)
188
+ ChunkyPNG::Image.from_rgba_stream(width, height, bin).flip
189
189
  end
190
190
 
191
191
  # Decode image from ARGB32 binary
@@ -199,7 +199,7 @@ module Mikunyan
199
199
  c = BinUtils.get_int32_be(bin, i*4)
200
200
  BinUtils.append_int32_be!(mem, ((c & 0x00ffffff) << 8) | ((c & 0xff000000) >> 24))
201
201
  end
202
- ChunkyPNG::Image.from_rgba_stream(width, height, mem)
202
+ ChunkyPNG::Image.from_rgba_stream(width, height, mem).flip
203
203
  end
204
204
 
205
205
  # Decode image from BGRA32 binary
@@ -213,7 +213,7 @@ module Mikunyan
213
213
  c = BinUtils.get_int32_le(bin, i*4)
214
214
  BinUtils.append_int32_be!(mem, ((c & 0x00ffffff) << 8) | ((c & 0xff000000) >> 24))
215
215
  end
216
- ChunkyPNG::Image.from_rgba_stream(width, height, mem)
216
+ ChunkyPNG::Image.from_rgba_stream(width, height, mem).flip
217
217
  end
218
218
 
219
219
  # Decode image from R16 binary
@@ -229,7 +229,7 @@ module Mikunyan
229
229
  c = f2i(r / 65535.0)
230
230
  BinUtils.append_int8!(mem, c, c, c)
231
231
  end
232
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
232
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
233
233
  end
234
234
 
235
235
  # Decode image from RGB9e5 binary
@@ -251,7 +251,7 @@ module Mikunyan
251
251
  b = (b / 512r + 1) * (2**(e-15))
252
252
  BinUtils.append_int8!(mem, f2i(r), f2i(g), f2i(b))
253
253
  end
254
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
254
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
255
255
  end
256
256
 
257
257
  # Decode image from R Half-float binary
@@ -266,7 +266,7 @@ module Mikunyan
266
266
  c = f2i(n2f(endian == :little ? BinUtils.get_int16_le(bin, i*2) : BinUtils.get_int16_be(bin, i*2)))
267
267
  BinUtils.append_int8!(mem, c, c, c)
268
268
  end
269
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
269
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
270
270
  end
271
271
 
272
272
  # Decode image from RG Half-float binary
@@ -282,7 +282,7 @@ module Mikunyan
282
282
  g = f2i(n2f(endian == :little ? BinUtils.get_int16_le(bin, i*4+2) : BinUtils.get_int16_be(bin, i*4+2)))
283
283
  BinUtils.append_int8!(mem, r, g, 0)
284
284
  end
285
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
285
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
286
286
  end
287
287
 
288
288
  # Decode image from RGBA Half-float binary
@@ -300,7 +300,7 @@ module Mikunyan
300
300
  a = f2i(n2f(endian == :little ? BinUtils.get_int16_le(bin, i*8+6) : BinUtils.get_int16_be(bin, i*8+6)))
301
301
  BinUtils.append_int8!(mem, r, g, b, a)
302
302
  end
303
- ChunkyPNG::Image.from_rgba_stream(width, height, mem)
303
+ ChunkyPNG::Image.from_rgba_stream(width, height, mem).flip
304
304
  end
305
305
 
306
306
  # Decode image from R float binary
@@ -316,7 +316,7 @@ module Mikunyan
316
316
  c = f2i(bin.byteslice(i*4, 4).unpack(unpackstr)[0])
317
317
  BinUtils.append_int8!(mem, c, c, c)
318
318
  end
319
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
319
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
320
320
  end
321
321
 
322
322
  # Decode image from RG float binary
@@ -332,7 +332,7 @@ module Mikunyan
332
332
  r, g = bin.byteslice(i*8, 8).unpack(unpackstr)
333
333
  BinUtils.append_int8!(mem, f2i(r), f2i(g), 0)
334
334
  end
335
- ChunkyPNG::Image.from_rgb_stream(width, height, mem)
335
+ ChunkyPNG::Image.from_rgb_stream(width, height, mem).flip
336
336
  end
337
337
 
338
338
  # Decode image from RGBA float binary
@@ -348,7 +348,7 @@ module Mikunyan
348
348
  r, g, b, a = bin.byteslice(i*16, 16).unpack(unpackstr)
349
349
  BinUtils.append_int8!(mem, f2i(r), f2i(g), f2i(b), f2i(a))
350
350
  end
351
- ChunkyPNG::Image.from_rgba_stream(width, height, mem)
351
+ ChunkyPNG::Image.from_rgba_stream(width, height, mem).flip
352
352
  end
353
353
 
354
354
  # Decode image from ETC1 compressed binary
@@ -1,4 +1,4 @@
1
1
  module Mikunyan
2
2
  # version string
3
- VERSION = "3.9.3"
3
+ VERSION = "3.9.4"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mikunyan
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.9.3
4
+ version: 3.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ishotihadus
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-01-15 00:00:00.000000000 Z
11
+ date: 2018-01-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: extlz4
@@ -98,6 +98,7 @@ description: Library to deserialize Unity assetbundles and assets.
98
98
  email:
99
99
  - hanachan.pao@gmail.com
100
100
  executables:
101
+ - mikunyan-image
101
102
  - mikunyan-json
102
103
  extensions: []
103
104
  extra_rdoc_files: []
@@ -110,6 +111,7 @@ files:
110
111
  - Rakefile
111
112
  - bin/console
112
113
  - bin/setup
114
+ - exe/mikunyan-image
113
115
  - exe/mikunyan-json
114
116
  - lib/mikunyan.rb
115
117
  - lib/mikunyan/asset.rb
@@ -1033,7 +1035,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1033
1035
  version: '0'
1034
1036
  requirements: []
1035
1037
  rubyforge_project:
1036
- rubygems_version: 2.6.13
1038
+ rubygems_version: 2.7.3
1037
1039
  signing_key:
1038
1040
  specification_version: 4
1039
1041
  summary: Unity asset deserializer for Ruby