pgtools 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +25 -25
  3. data/bin/bxm_decoder +2 -2
  4. data/bin/bxm_encoder +2 -2
  5. data/bin/clh_convert +2 -2
  6. data/bin/clp_convert +2 -2
  7. data/bin/clw_convert +2 -2
  8. data/bin/dat_creator +2 -2
  9. data/bin/dat_extractor +2 -2
  10. data/bin/dat_ls +2 -2
  11. data/bin/eff_idd_creator +2 -2
  12. data/bin/eff_idd_extractor +2 -2
  13. data/bin/exp_convert_wiiu_pc +2 -2
  14. data/bin/exp_tool +2 -2
  15. data/bin/mot_convert_wiiu_pc +2 -2
  16. data/bin/mot_tool +2 -2
  17. data/bin/pkz_extractor +2 -2
  18. data/bin/scr_creator +2 -2
  19. data/bin/scr_extractor +2 -2
  20. data/bin/wmb_cleanup +2 -2
  21. data/bin/wmb_common_bones +2 -2
  22. data/bin/wmb_convert_pc_switch +2 -2
  23. data/bin/wmb_convert_wiiu_pc +2 -2
  24. data/bin/wmb_export_assimp +2 -2
  25. data/bin/wmb_get_bone_map +2 -2
  26. data/bin/wmb_import_assimp +2 -2
  27. data/bin/wmb_import_nier +2 -2
  28. data/bin/wmb_import_wiiu +2 -2
  29. data/bin/wtb_convert_wiiu_pc +2 -2
  30. data/bin/wtx_creator +2 -2
  31. data/bin/wtx_extractor +2 -2
  32. data/lib/bayonetta/alignment.rb +0 -0
  33. data/lib/bayonetta/bone.rb +0 -0
  34. data/lib/bayonetta/bxm.rb +180 -180
  35. data/lib/bayonetta/clh.rb +159 -159
  36. data/lib/bayonetta/clp.rb +212 -212
  37. data/lib/bayonetta/clw.rb +166 -166
  38. data/lib/bayonetta/dat.rb +261 -261
  39. data/lib/bayonetta/eff.rb +314 -314
  40. data/lib/bayonetta/endianness.rb +0 -0
  41. data/lib/bayonetta/exp.rb +768 -768
  42. data/lib/bayonetta/linalg.rb +416 -416
  43. data/lib/bayonetta/material_database.yaml +2581 -2581
  44. data/lib/bayonetta/mot.rb +763 -763
  45. data/lib/bayonetta/pkz.rb +63 -63
  46. data/lib/bayonetta/scr.rb +0 -0
  47. data/lib/bayonetta/tools/bxm_decoder.rb +23 -23
  48. data/lib/bayonetta/tools/bxm_encoder.rb +37 -37
  49. data/lib/bayonetta/tools/clh_convert.rb +60 -60
  50. data/lib/bayonetta/tools/clp_convert.rb +70 -70
  51. data/lib/bayonetta/tools/clw_convert.rb +60 -60
  52. data/lib/bayonetta/tools/dat_creator.rb +57 -57
  53. data/lib/bayonetta/tools/dat_extractor.rb +94 -94
  54. data/lib/bayonetta/tools/dat_ls.rb +106 -106
  55. data/lib/bayonetta/tools/eff_idd_creator.rb +66 -66
  56. data/lib/bayonetta/tools/eff_idd_extractor.rb +73 -73
  57. data/lib/bayonetta/tools/exp_convert_wiiu_pc.rb +33 -33
  58. data/lib/bayonetta/tools/exp_tool.rb +48 -48
  59. data/lib/bayonetta/tools/mot_convert_wiiu_pc.rb +33 -33
  60. data/lib/bayonetta/tools/mot_tool.rb +0 -0
  61. data/lib/bayonetta/tools/pkz_extractor.rb +75 -75
  62. data/lib/bayonetta/tools/scr_creator.rb +63 -63
  63. data/lib/bayonetta/tools/scr_extractor.rb +78 -78
  64. data/lib/bayonetta/tools/wmb_cleanup.rb +250 -250
  65. data/lib/bayonetta/tools/wmb_common_bones.rb +45 -45
  66. data/lib/bayonetta/tools/wmb_convert_pc_switch.rb +35 -35
  67. data/lib/bayonetta/tools/wmb_convert_wiiu_pc.rb +33 -33
  68. data/lib/bayonetta/tools/wmb_export_assimp.rb +479 -479
  69. data/lib/bayonetta/tools/wmb_get_bone_map.rb +50 -50
  70. data/lib/bayonetta/tools/wmb_import_assimp.rb +735 -735
  71. data/lib/bayonetta/tools/wmb_import_geometry_wiiu_pc.rb +472 -472
  72. data/lib/bayonetta/tools/wmb_import_nier.rb +309 -309
  73. data/lib/bayonetta/tools/wtb_convert_wiiu_pc.rb +95 -95
  74. data/lib/bayonetta/tools/wtb_import_textures.rb +103 -103
  75. data/lib/bayonetta/tools/wtx_creator.rb +69 -69
  76. data/lib/bayonetta/tools/wtx_extractor.rb +85 -85
  77. data/lib/bayonetta/vertex_types.yaml +0 -0
  78. data/lib/bayonetta/vertex_types2.yaml +0 -0
  79. data/lib/bayonetta/vertex_types_nier.yaml +145 -145
  80. data/lib/bayonetta/wmb.rb +2455 -2443
  81. data/lib/bayonetta/wmb3.rb +759 -759
  82. data/lib/bayonetta/wtb.rb +481 -481
  83. data/lib/bayonetta.rb +60 -60
  84. metadata +2 -2
@@ -1,78 +1,78 @@
1
- require 'optparse'
2
- require 'yaml'
3
- require_relative '../../bayonetta'
4
-
5
- $options = {
6
- output: nil
7
- }
8
-
9
- OptionParser.new do |opts|
10
- opts.banner = <<EOF
11
- Usage: scr_extractor file
12
- EOF
13
- opts.on("-h", "--help", "Prints this help") do
14
- puts opts
15
- exit
16
- end
17
-
18
- opts.on("-o", "--output=dirname", "directory to output result") do |name|
19
- $options[:output] = name
20
- end
21
-
22
- end.parse!
23
-
24
- save_pwd = Dir.pwd
25
-
26
- raise "Invalid output directory #{$options[:output]}" if $options[:output] && !Dir.exist?($options[:output])
27
-
28
- filename = ARGV[0]
29
- raise "Invalid file: #{filename}!" unless filename && File.exist?(filename)
30
- directory = File.dirname(filename)
31
- name = File.basename(filename)
32
- ext_name = File.extname(name)
33
-
34
- raise "Invalid file: #{filename}!" unless ext_name == ".scr"
35
-
36
- f = File::open(filename, "rb")
37
-
38
- if $options[:output]
39
- Dir.chdir(save_pwd)
40
- Dir.chdir($options[:output])
41
- else
42
- Dir.chdir(directory)
43
- end
44
- dir_name = File.basename(name, ext_name) + "#{ext_name.gsub(".","_")}"
45
- Dir.mkdir(dir_name) unless Dir.exist?(dir_name)
46
- Dir.chdir(dir_name)
47
-
48
- scr = Bayonetta::SCRFile::load(f)
49
-
50
- scr.each_model.each_with_index { |f1, i|
51
- File::open("%03d.wmb" % [i] , "wb") { |f2|
52
- f1.rewind
53
- f2.write(f1.read)
54
- }
55
- }
56
-
57
- f1 = scr.textures
58
- if f1
59
- File::open("000.wtb", "wb") { |f2|
60
- f1.rewind
61
- f2.write(f1.read)
62
- }
63
- end
64
-
65
- Dir.mkdir(".metadata") unless Dir.exist?(".metadata")
66
- Dir.chdir(".metadata")
67
- File::open("models_metadata.yaml", "w") { |fl|
68
- fl.print YAML::dump( scr.models_metadata )
69
- }
70
- File::open("big.yaml","w") { |fl|
71
- fl.print YAML::dump( scr.big )
72
- }
73
- File::open("bayo2.yaml","w") { |fl|
74
- fl.print YAML::dump( scr.bayo2? )
75
- }
76
- File::open("unknown.yaml", "w") { |fl|
77
- fl.print YAML::dump( scr.unknown )
78
- }
1
+ require 'optparse'
2
+ require 'yaml'
3
+ require_relative '../../bayonetta'
4
+
5
+ $options = {
6
+ output: nil
7
+ }
8
+
9
+ OptionParser.new do |opts|
10
+ opts.banner = <<EOF
11
+ Usage: scr_extractor file
12
+ EOF
13
+ opts.on("-h", "--help", "Prints this help") do
14
+ puts opts
15
+ exit
16
+ end
17
+
18
+ opts.on("-o", "--output=dirname", "directory to output result") do |name|
19
+ $options[:output] = name
20
+ end
21
+
22
+ end.parse!
23
+
24
+ save_pwd = Dir.pwd
25
+
26
+ raise "Invalid output directory #{$options[:output]}" if $options[:output] && !Dir.exist?($options[:output])
27
+
28
+ filename = ARGV[0]
29
+ raise "Invalid file: #{filename}!" unless filename && File.exist?(filename)
30
+ directory = File.dirname(filename)
31
+ name = File.basename(filename)
32
+ ext_name = File.extname(name)
33
+
34
+ raise "Invalid file: #{filename}!" unless ext_name == ".scr"
35
+
36
+ f = File::open(filename, "rb")
37
+
38
+ if $options[:output]
39
+ Dir.chdir(save_pwd)
40
+ Dir.chdir($options[:output])
41
+ else
42
+ Dir.chdir(directory)
43
+ end
44
+ dir_name = File.basename(name, ext_name) + "#{ext_name.gsub(".","_")}"
45
+ Dir.mkdir(dir_name) unless Dir.exist?(dir_name)
46
+ Dir.chdir(dir_name)
47
+
48
+ scr = Bayonetta::SCRFile::load(f)
49
+
50
+ scr.each_model.each_with_index { |f1, i|
51
+ File::open("%03d.wmb" % [i] , "wb") { |f2|
52
+ f1.rewind
53
+ f2.write(f1.read)
54
+ }
55
+ }
56
+
57
+ f1 = scr.textures
58
+ if f1
59
+ File::open("000.wtb", "wb") { |f2|
60
+ f1.rewind
61
+ f2.write(f1.read)
62
+ }
63
+ end
64
+
65
+ Dir.mkdir(".metadata") unless Dir.exist?(".metadata")
66
+ Dir.chdir(".metadata")
67
+ File::open("models_metadata.yaml", "w") { |fl|
68
+ fl.print YAML::dump( scr.models_metadata )
69
+ }
70
+ File::open("big.yaml","w") { |fl|
71
+ fl.print YAML::dump( scr.big )
72
+ }
73
+ File::open("bayo2.yaml","w") { |fl|
74
+ fl.print YAML::dump( scr.bayo2? )
75
+ }
76
+ File::open("unknown.yaml", "w") { |fl|
77
+ fl.print YAML::dump( scr.unknown )
78
+ }
@@ -1,250 +1,250 @@
1
- require 'optparse'
2
- require 'yaml'
3
- require_relative '../../bayonetta'
4
- include Bayonetta
5
-
6
- $options = {
7
- :vertexes => false,
8
- :bones => false,
9
- :remap_bones => false,
10
- :textures => false,
11
- :cleanup_mat => false,
12
- :cleanup_mat_sizes => false,
13
- :maximize_mat_sizes => false,
14
- :delete_bones => nil,
15
- :offsets => false,
16
- :fix => false,
17
- :swap => nil,
18
- :swap_meshes => nil,
19
- :move_meshes => nil,
20
- :delete_meshes => nil,
21
- :delete_batches => nil,
22
- :merge_meshes => nil,
23
- :overwrite => nil
24
- }
25
-
26
- OptionParser.new do |opts|
27
- opts.banner = "Usage: wmb_cleanup.rb target_file [options]"
28
-
29
- opts.on("--[no-]bone-refs", "Cleanup bone refs in batches") do |bone_refs|
30
- $options[:bone_refs] = bone_refs
31
- end
32
-
33
- opts.on("--[no-]add-parents-bone-refs", "Add ancestry to bone refs and sort them") do |bone_refs|
34
- $options[:submodel_bone_refs] = bone_refs
35
- end
36
-
37
- opts.on("--[no-]add-previous-bone-refs", "Add all previous bones to bone refs and sort them") do |bone_refs|
38
- $options[:previous_bone_refs] = bone_refs
39
- end
40
-
41
- opts.on("-b", "--[no-]bones", "Cleanup bones") do |bones|
42
- $options[:bones] = bones
43
- end
44
-
45
- opts.on("--remap-bones=BONEMAP", "Remaps specified local bones to global bone indexes") do |bone_map|
46
- if File.exist?(bone_map)
47
- $options[:remap_bones] = YAML::load_file(bone_map)
48
- else
49
- $options[:remap_bones] = eval(bone_map).to_h
50
- end
51
- end
52
-
53
- opts.on("--[no-]order-bones", "Order bones in their global numbering if possible") do |order_bones|
54
- $options[:order_bones] = order_bones
55
- end
56
-
57
- opts.on("-v", "--[no-]vertexes", "Cleanup vertexes") do |vertexes|
58
- $options[:vertexes] = vertexes
59
- end
60
-
61
- opts.on("--[no-]remove_duplicate_vertexes", "Ensure no vertex is used more than once") do |rdv|
62
- $options[:remove_duplicate_vertexes] = rdv
63
- end
64
-
65
- opts.on("--[no-]normalize-vertex-usage", "Ensure no vertex is used in more than 1 batch") do |nvu|
66
- $options[:normalize_vertex_usage] = nvu
67
- end
68
-
69
- opts.on("-o", "--[no-]remove-batch-offsets", "Remove batch vertex offsets") do |o|
70
- $options[:offsets] = o
71
- end
72
-
73
- opts.on("--[no-]check-normals", "Try to detect wide normals (Switch)") do |cn|
74
- $options[:check_normals] = cn
75
- end
76
-
77
- opts.on("-f", "--[no-]fix-ex-data", "Put normal map u v in ex data") do |fix|
78
- $options[:fix] = fix
79
- end
80
-
81
- opts.on("--copy-uv1to2=MESHLIST", "Copy the first UV mapping to the second one") do |copy_uv|
82
- $options[:copy_uv] = eval(copy_uv).to_a
83
- end
84
-
85
- opts.on("--[no-]remove-triangle-strips", "Remove triangle strips and replace by triangles") do |strips|
86
- $options[:strips] = strips
87
- end
88
-
89
- opts.on("--revert-triangles=MESHLIST", "Revert traiangle faces") do |revert|
90
- $options[:revert] = eval(revert).to_a
91
- end
92
-
93
- opts.on("-e", "--swap-endianness", "Swap endianness") do |swap|
94
- $options[:swap] = swap
95
- end
96
-
97
- opts.on("--duplicate-meshes=MESHLIST", "Duplicate specified meshes") do |mesh_list|
98
- $options[:duplicate_meshes] = eval(mesh_list).to_a
99
- end
100
-
101
- opts.on("-s", "--swap-meshes=MESHHASH", "Swap specified meshes") do |mesh_hash|
102
- $options[:swap_meshes] = eval(mesh_hash).to_h
103
- end
104
-
105
- opts.on("--merge-meshes=MESHHASH", "Merge specified meshes") do |mesh_hash|
106
- $options[:merge_meshes] = eval(mesh_hash).to_h
107
- end
108
-
109
- opts.on("--move-meshes=MESHHASH", "Move the specified meshes to the specified positions") do |mesh_positions|
110
- $options[:move_meshes] = eval(mesh_positions).to_h
111
- end
112
-
113
- opts.on("-m", "--delete-meshes=MESHLIST", "Delete specified meshes") do |mesh_list|
114
- $options[:delete_meshes] = eval(mesh_list).to_a
115
- end
116
-
117
- opts.on("--delete-batches=BATCHLIST", "Delete specified batch list (WMB3) or { mesh => batch list } hash") do |batch_list|
118
- $options[:delete_batches] = eval(batch_list).to_a
119
- end
120
-
121
- opts.on("--dummy=MESHHLIST", "Replace a given meshes by dummy mesh with one dummy batch") do |mesh_list|
122
- $options[:dummy_meshes] = eval(mesh_list).to_a
123
- end
124
-
125
- opts.on("--split-meshes=MESHLIST", "Split the selected meshes into meshes containing only one batch") do |split_meshes|
126
- $options[:split_meshes] = eval(split_meshes).to_a
127
- end
128
-
129
- opts.on("-d", "--delete-bones=BONELIST", "Delete specified bones") do |bone_list|
130
- $options[:delete_bones] = eval(bone_list).to_a
131
- end
132
-
133
- opts.on("-t", "--[no-]textures", "Cleanup textures") do |textures|
134
- $options[:textures] = textures
135
- end
136
-
137
- opts.on("-c", "--cleanup-materials", "Cleanup materials") do |cleanup_mat|
138
- $options[:cleanup_mat] = cleanup_mat
139
- end
140
-
141
- opts.on("--cleanup-material-sizes", "Cleanup material sizes") do |cleanup_mat_sizes|
142
- $options[:cleanup_mat_sizes] = cleanup_mat_sizes
143
- end
144
-
145
- opts.on("--maximize-material-sizes", "Maximize material sizes") do |maximize_mat_sizes|
146
- $options[:maximize_mat_sizes] = maximize_mat_sizes
147
- end
148
-
149
- opts.on("--overwrite", "Overwrite input file") do |overwrite|
150
- $options[:overwrite] = overwrite
151
- end
152
-
153
- opts.on("--scale=SCALE", "Scales the model by a factor") do |scale|
154
- $options[:scale] = scale.to_f
155
- end
156
-
157
- opts.on("--shift=SHIFT_VECTOR", "Shifts the model") do |shift|
158
- $options[:shift] = eval(shift).to_a
159
- end
160
-
161
- opts.on("--reverse-tangents-byte-order=MESH_LIST", "Fixes the tangents import that was buggy, only use on bayo 2 imported meshes...") do |tan|
162
- $options[:reverse_tangents] = eval(tan).to_a
163
- end
164
-
165
- opts.on("--[no-]recompute-relative-positions", "Recomputes relative bone positions...") do |recomp|
166
- $options[:recompute_relative_positions] = recomp
167
- end
168
-
169
- opts.on("--set-pose=POSE_FILE", "Set model to the given pose") do |pose|
170
- $options[:set_pose] = YAML::load_file(pose)
171
- end
172
-
173
- opts.on("--[no-]set-t-pose", "Set the model to a t pose (WMB3)") do |tpose|
174
- $options[:set_tpose] = tpose
175
- end
176
-
177
- opts.on("--rotate=ROTATE_INFO", "Rotates the model.",
178
- " ROTATE_INFO is either:",
179
- " [rx, ry, rz] rotation (in radian) respectively around the x, y and z axis (in this order)",
180
- " [[rx, ry, rz], [x, y, z]] with the center of the rotation specified" ) do |rotate|
181
- $options[:rotate] = eval(rotate).to_a
182
- end
183
-
184
- opts.on("-h", "--help", "Prints this help") do
185
- puts opts
186
- exit
187
- end
188
-
189
- end.parse!
190
-
191
-
192
- input_file = ARGV[0]
193
-
194
- raise "Invalid file: #{input_file}" unless input_file && File::file?(input_file)
195
- Dir.mkdir("wmb_output") unless Dir.exist?("wmb_output")
196
- Dir.mkdir("wtb_output") unless Dir.exist?("wtb_output")
197
- wmb = WMBFile::load(input_file)
198
- wmb.check_normals if $options[:check_normals]
199
- wmb.scale($options[:scale]) if $options[:scale]
200
- wmb.rotate(*($options[:rotate])) if $options[:rotate]
201
- wmb.shift(*($options[:shift])) if $options[:shift]
202
- wmb.delete_batches($options[:delete_batches]) if $options[:delete_batches]
203
- wmb.split_meshes($options[:split_meshes]) if $options[:split_meshes]
204
- wmb.duplicate_meshes($options[:duplicate_meshes]) if $options[:duplicate_meshes]
205
- wmb.move_meshes($options[:move_meshes]) if $options[:move_meshes]
206
- wmb.swap_meshes($options[:swap_meshes]) if $options[:swap_meshes]
207
- wmb.merge_meshes($options[:merge_meshes]) if $options[:merge_meshes]
208
- wmb.dummy_meshes($options[:dummy_meshes]) if $options[:dummy_meshes]
209
- wmb.delete_meshes($options[:delete_meshes]) if $options[:delete_meshes]
210
- wmb.cleanup_bone_refs if $options[:bone_refs]
211
- wmb.add_ancestors_bone_refs if $options[:submodel_bone_refs]
212
- wmb.add_previous_bone_refs if $options[:previous_bone_refs]
213
- wmb.cleanup_bones if $options[:bones]
214
- wmb.recompute_relative_positions if $options[:recompute_relative_positions]
215
- wmb.remove_duplicate_vertexes if $options[:remove_duplicate_vertexes]
216
- wmb.normalize_vertex_usage if $options[:normalize_vertex_usage]
217
- wmb.remove_triangle_strips if $options[:strips]
218
- wmb.revert_triangles($options[:revert]) if $options[:revert]
219
- wmb.cleanup_vertexes if $options[:vertexes]
220
- wmb.remove_batch_vertex_offsets if $options[:offsets]
221
- wmb.fix_ex_data if $options[:fix]
222
- wmb.copy_uv12($options[:copy_uv]) if $options[:copy_uv]
223
- wmb.reverse_tangents_byte_order($options[:reverse_tangents]) if $options[:reverse_tangents]
224
- if $options[:set_pose]
225
- exp_name = input_file.gsub(".wmb", ".exp")
226
- exp = nil
227
- if File::file?(exp_name)
228
- exp = EXPFile::load(exp_name)
229
- end
230
- wmb.set_pose($options[:set_pose], exp)
231
- end
232
- if $options[:set_tpose]
233
- wmb.set_tpose
234
- end
235
- wmb.delete_bones($options[:delete_bones]) if $options[:delete_bones]
236
- wmb.remap_bones($options[:remap_bones]) if $options[:remap_bones]
237
- wmb.order_bones if $options[:order_bones]
238
- wmb.cleanup_materials if $options[:cleanup_mat]
239
- wmb.cleanup_material_sizes if $options[:cleanup_mat_sizes]
240
- wmb.maximize_material_sizes if $options[:maximize_mat_sizes]
241
- wmb.cleanup_textures(input_file, $options[:overwrite]) if $options[:textures]
242
- unless wmb.class == WMB3File
243
- wmb.renumber_batches
244
- end
245
- wmb.recompute_layout
246
- if $options[:overwrite]
247
- wmb.dump(input_file, $options[:swap] ? !wmb.was_big? : wmb.was_big? )
248
- else
249
- wmb.dump("wmb_output/"+File.basename(input_file), $options[:swap] ? !wmb.was_big? : wmb.was_big? )
250
- end
1
+ require 'optparse'
2
+ require 'yaml'
3
+ require_relative '../../bayonetta'
4
+ include Bayonetta
5
+
6
+ $options = {
7
+ :vertexes => false,
8
+ :bones => false,
9
+ :remap_bones => false,
10
+ :textures => false,
11
+ :cleanup_mat => false,
12
+ :cleanup_mat_sizes => false,
13
+ :maximize_mat_sizes => false,
14
+ :delete_bones => nil,
15
+ :offsets => false,
16
+ :fix => false,
17
+ :swap => nil,
18
+ :swap_meshes => nil,
19
+ :move_meshes => nil,
20
+ :delete_meshes => nil,
21
+ :delete_batches => nil,
22
+ :merge_meshes => nil,
23
+ :overwrite => nil
24
+ }
25
+
26
+ OptionParser.new do |opts|
27
+ opts.banner = "Usage: wmb_cleanup.rb target_file [options]"
28
+
29
+ opts.on("--[no-]bone-refs", "Cleanup bone refs in batches") do |bone_refs|
30
+ $options[:bone_refs] = bone_refs
31
+ end
32
+
33
+ opts.on("--[no-]add-parents-bone-refs", "Add ancestry to bone refs and sort them") do |bone_refs|
34
+ $options[:submodel_bone_refs] = bone_refs
35
+ end
36
+
37
+ opts.on("--[no-]add-previous-bone-refs", "Add all previous bones to bone refs and sort them") do |bone_refs|
38
+ $options[:previous_bone_refs] = bone_refs
39
+ end
40
+
41
+ opts.on("-b", "--[no-]bones", "Cleanup bones") do |bones|
42
+ $options[:bones] = bones
43
+ end
44
+
45
+ opts.on("--remap-bones=BONEMAP", "Remaps specified local bones to global bone indexes") do |bone_map|
46
+ if File.exist?(bone_map)
47
+ $options[:remap_bones] = YAML::load_file(bone_map)
48
+ else
49
+ $options[:remap_bones] = eval(bone_map).to_h
50
+ end
51
+ end
52
+
53
+ opts.on("--[no-]order-bones", "Order bones in their global numbering if possible") do |order_bones|
54
+ $options[:order_bones] = order_bones
55
+ end
56
+
57
+ opts.on("-v", "--[no-]vertexes", "Cleanup vertexes") do |vertexes|
58
+ $options[:vertexes] = vertexes
59
+ end
60
+
61
+ opts.on("--[no-]remove_duplicate_vertexes", "Ensure no vertex is used more than once") do |rdv|
62
+ $options[:remove_duplicate_vertexes] = rdv
63
+ end
64
+
65
+ opts.on("--[no-]normalize-vertex-usage", "Ensure no vertex is used in more than 1 batch") do |nvu|
66
+ $options[:normalize_vertex_usage] = nvu
67
+ end
68
+
69
+ opts.on("-o", "--[no-]remove-batch-offsets", "Remove batch vertex offsets") do |o|
70
+ $options[:offsets] = o
71
+ end
72
+
73
+ opts.on("--[no-]check-normals", "Try to detect wide normals (Switch)") do |cn|
74
+ $options[:check_normals] = cn
75
+ end
76
+
77
+ opts.on("-f", "--[no-]fix-ex-data", "Put normal map u v in ex data") do |fix|
78
+ $options[:fix] = fix
79
+ end
80
+
81
+ opts.on("--copy-uv1to2=MESHLIST", "Copy the first UV mapping to the second one") do |copy_uv|
82
+ $options[:copy_uv] = eval(copy_uv).to_a
83
+ end
84
+
85
+ opts.on("--[no-]remove-triangle-strips", "Remove triangle strips and replace by triangles") do |strips|
86
+ $options[:strips] = strips
87
+ end
88
+
89
+ opts.on("--revert-triangles=MESHLIST", "Revert traiangle faces") do |revert|
90
+ $options[:revert] = eval(revert).to_a
91
+ end
92
+
93
+ opts.on("-e", "--swap-endianness", "Swap endianness") do |swap|
94
+ $options[:swap] = swap
95
+ end
96
+
97
+ opts.on("--duplicate-meshes=MESHLIST", "Duplicate specified meshes") do |mesh_list|
98
+ $options[:duplicate_meshes] = eval(mesh_list).to_a
99
+ end
100
+
101
+ opts.on("-s", "--swap-meshes=MESHHASH", "Swap specified meshes") do |mesh_hash|
102
+ $options[:swap_meshes] = eval(mesh_hash).to_h
103
+ end
104
+
105
+ opts.on("--merge-meshes=MESHHASH", "Merge specified meshes") do |mesh_hash|
106
+ $options[:merge_meshes] = eval(mesh_hash).to_h
107
+ end
108
+
109
+ opts.on("--move-meshes=MESHHASH", "Move the specified meshes to the specified positions") do |mesh_positions|
110
+ $options[:move_meshes] = eval(mesh_positions).to_h
111
+ end
112
+
113
+ opts.on("-m", "--delete-meshes=MESHLIST", "Delete specified meshes") do |mesh_list|
114
+ $options[:delete_meshes] = eval(mesh_list).to_a
115
+ end
116
+
117
+ opts.on("--delete-batches=BATCHLIST", "Delete specified batch list (WMB3) or { mesh => batch list } hash") do |batch_list|
118
+ $options[:delete_batches] = eval(batch_list).to_a
119
+ end
120
+
121
+ opts.on("--dummy=MESHHLIST", "Replace a given meshes by dummy mesh with one dummy batch") do |mesh_list|
122
+ $options[:dummy_meshes] = eval(mesh_list).to_a
123
+ end
124
+
125
+ opts.on("--split-meshes=MESHLIST", "Split the selected meshes into meshes containing only one batch") do |split_meshes|
126
+ $options[:split_meshes] = eval(split_meshes).to_a
127
+ end
128
+
129
+ opts.on("-d", "--delete-bones=BONELIST", "Delete specified bones") do |bone_list|
130
+ $options[:delete_bones] = eval(bone_list).to_a
131
+ end
132
+
133
+ opts.on("-t", "--[no-]textures", "Cleanup textures") do |textures|
134
+ $options[:textures] = textures
135
+ end
136
+
137
+ opts.on("-c", "--cleanup-materials", "Cleanup materials") do |cleanup_mat|
138
+ $options[:cleanup_mat] = cleanup_mat
139
+ end
140
+
141
+ opts.on("--cleanup-material-sizes", "Cleanup material sizes") do |cleanup_mat_sizes|
142
+ $options[:cleanup_mat_sizes] = cleanup_mat_sizes
143
+ end
144
+
145
+ opts.on("--maximize-material-sizes", "Maximize material sizes") do |maximize_mat_sizes|
146
+ $options[:maximize_mat_sizes] = maximize_mat_sizes
147
+ end
148
+
149
+ opts.on("--overwrite", "Overwrite input file") do |overwrite|
150
+ $options[:overwrite] = overwrite
151
+ end
152
+
153
+ opts.on("--scale=SCALE", "Scales the model by a factor") do |scale|
154
+ $options[:scale] = scale.to_f
155
+ end
156
+
157
+ opts.on("--shift=SHIFT_VECTOR", "Shifts the model") do |shift|
158
+ $options[:shift] = eval(shift).to_a
159
+ end
160
+
161
+ opts.on("--reverse-tangents-byte-order=MESH_LIST", "Fixes the tangents import that was buggy, only use on bayo 2 imported meshes...") do |tan|
162
+ $options[:reverse_tangents] = eval(tan).to_a
163
+ end
164
+
165
+ opts.on("--[no-]recompute-relative-positions", "Recomputes relative bone positions...") do |recomp|
166
+ $options[:recompute_relative_positions] = recomp
167
+ end
168
+
169
+ opts.on("--set-pose=POSE_FILE", "Set model to the given pose") do |pose|
170
+ $options[:set_pose] = YAML::load_file(pose)
171
+ end
172
+
173
+ opts.on("--[no-]set-t-pose", "Set the model to a t pose (WMB3)") do |tpose|
174
+ $options[:set_tpose] = tpose
175
+ end
176
+
177
+ opts.on("--rotate=ROTATE_INFO", "Rotates the model.",
178
+ " ROTATE_INFO is either:",
179
+ " [rx, ry, rz] rotation (in radian) respectively around the x, y and z axis (in this order)",
180
+ " [[rx, ry, rz], [x, y, z]] with the center of the rotation specified" ) do |rotate|
181
+ $options[:rotate] = eval(rotate).to_a
182
+ end
183
+
184
+ opts.on("-h", "--help", "Prints this help") do
185
+ puts opts
186
+ exit
187
+ end
188
+
189
+ end.parse!
190
+
191
+
192
+ input_file = ARGV[0]
193
+
194
+ raise "Invalid file: #{input_file}" unless input_file && File::file?(input_file)
195
+ Dir.mkdir("wmb_output") unless Dir.exist?("wmb_output")
196
+ Dir.mkdir("wtb_output") unless Dir.exist?("wtb_output")
197
+ wmb = WMBFile::load(input_file)
198
+ wmb.check_normals if $options[:check_normals]
199
+ wmb.scale($options[:scale]) if $options[:scale]
200
+ wmb.rotate(*($options[:rotate])) if $options[:rotate]
201
+ wmb.shift(*($options[:shift])) if $options[:shift]
202
+ wmb.delete_batches($options[:delete_batches]) if $options[:delete_batches]
203
+ wmb.split_meshes($options[:split_meshes]) if $options[:split_meshes]
204
+ wmb.duplicate_meshes($options[:duplicate_meshes]) if $options[:duplicate_meshes]
205
+ wmb.move_meshes($options[:move_meshes]) if $options[:move_meshes]
206
+ wmb.swap_meshes($options[:swap_meshes]) if $options[:swap_meshes]
207
+ wmb.merge_meshes($options[:merge_meshes]) if $options[:merge_meshes]
208
+ wmb.dummy_meshes($options[:dummy_meshes]) if $options[:dummy_meshes]
209
+ wmb.delete_meshes($options[:delete_meshes]) if $options[:delete_meshes]
210
+ wmb.cleanup_bone_refs if $options[:bone_refs]
211
+ wmb.add_ancestors_bone_refs if $options[:submodel_bone_refs]
212
+ wmb.add_previous_bone_refs if $options[:previous_bone_refs]
213
+ wmb.cleanup_bones if $options[:bones]
214
+ wmb.recompute_relative_positions if $options[:recompute_relative_positions]
215
+ wmb.remove_duplicate_vertexes if $options[:remove_duplicate_vertexes]
216
+ wmb.normalize_vertex_usage if $options[:normalize_vertex_usage]
217
+ wmb.remove_triangle_strips if $options[:strips]
218
+ wmb.revert_triangles($options[:revert]) if $options[:revert]
219
+ wmb.cleanup_vertexes if $options[:vertexes]
220
+ wmb.remove_batch_vertex_offsets if $options[:offsets]
221
+ wmb.fix_ex_data if $options[:fix]
222
+ wmb.copy_uv12($options[:copy_uv]) if $options[:copy_uv]
223
+ wmb.reverse_tangents_byte_order($options[:reverse_tangents]) if $options[:reverse_tangents]
224
+ if $options[:set_pose]
225
+ exp_name = input_file.gsub(".wmb", ".exp")
226
+ exp = nil
227
+ if File::file?(exp_name)
228
+ exp = EXPFile::load(exp_name)
229
+ end
230
+ wmb.set_pose($options[:set_pose], exp)
231
+ end
232
+ if $options[:set_tpose]
233
+ wmb.set_tpose
234
+ end
235
+ wmb.delete_bones($options[:delete_bones]) if $options[:delete_bones]
236
+ wmb.remap_bones($options[:remap_bones]) if $options[:remap_bones]
237
+ wmb.order_bones if $options[:order_bones]
238
+ wmb.cleanup_materials if $options[:cleanup_mat]
239
+ wmb.cleanup_material_sizes if $options[:cleanup_mat_sizes]
240
+ wmb.maximize_material_sizes if $options[:maximize_mat_sizes]
241
+ wmb.cleanup_textures(input_file, $options[:overwrite]) if $options[:textures]
242
+ unless wmb.class == WMB3File
243
+ wmb.renumber_batches
244
+ end
245
+ wmb.recompute_layout
246
+ if $options[:overwrite]
247
+ wmb.dump(input_file, $options[:swap] ? !wmb.was_big? : wmb.was_big? )
248
+ else
249
+ wmb.dump("wmb_output/"+File.basename(input_file), $options[:swap] ? !wmb.was_big? : wmb.was_big? )
250
+ end