pgtools 1.0.0

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 +7 -0
  2. data/LICENSE +25 -0
  3. data/bin/bxm_decoder +2 -0
  4. data/bin/bxm_encoder +2 -0
  5. data/bin/clh_convert +2 -0
  6. data/bin/clp_convert +2 -0
  7. data/bin/clw_convert +2 -0
  8. data/bin/dat_creator +2 -0
  9. data/bin/dat_extractor +2 -0
  10. data/bin/dat_ls +2 -0
  11. data/bin/eff_idd_creator +2 -0
  12. data/bin/eff_idd_extractor +2 -0
  13. data/bin/exp_convert_wiiu_pc +2 -0
  14. data/bin/exp_tool +2 -0
  15. data/bin/mot_convert_wiiu_pc +2 -0
  16. data/bin/mot_tool +2 -0
  17. data/bin/pkz_extractor +2 -0
  18. data/bin/scr_creator +2 -0
  19. data/bin/scr_extractor +2 -0
  20. data/bin/wmb_cleanup +2 -0
  21. data/bin/wmb_common_bones +2 -0
  22. data/bin/wmb_convert_pc_switch +2 -0
  23. data/bin/wmb_convert_wiiu_pc +2 -0
  24. data/bin/wmb_export_assimp +2 -0
  25. data/bin/wmb_get_bone_map +2 -0
  26. data/bin/wmb_import_assimp +2 -0
  27. data/bin/wmb_import_nier +2 -0
  28. data/bin/wmb_import_wiiu +2 -0
  29. data/bin/wtb_convert_wiiu_pc +2 -0
  30. data/bin/wtx_creator +2 -0
  31. data/bin/wtx_extractor +2 -0
  32. data/lib/bayonetta/alignment.rb +14 -0
  33. data/lib/bayonetta/bone.rb +55 -0
  34. data/lib/bayonetta/bxm.rb +180 -0
  35. data/lib/bayonetta/clh.rb +159 -0
  36. data/lib/bayonetta/clp.rb +212 -0
  37. data/lib/bayonetta/clw.rb +166 -0
  38. data/lib/bayonetta/dat.rb +261 -0
  39. data/lib/bayonetta/eff.rb +314 -0
  40. data/lib/bayonetta/endianness.rb +53 -0
  41. data/lib/bayonetta/exp.rb +768 -0
  42. data/lib/bayonetta/linalg.rb +416 -0
  43. data/lib/bayonetta/material_database.yaml +2581 -0
  44. data/lib/bayonetta/mot.rb +763 -0
  45. data/lib/bayonetta/pkz.rb +63 -0
  46. data/lib/bayonetta/scr.rb +393 -0
  47. data/lib/bayonetta/tools/bxm_decoder.rb +23 -0
  48. data/lib/bayonetta/tools/bxm_encoder.rb +37 -0
  49. data/lib/bayonetta/tools/clh_convert.rb +60 -0
  50. data/lib/bayonetta/tools/clp_convert.rb +70 -0
  51. data/lib/bayonetta/tools/clw_convert.rb +60 -0
  52. data/lib/bayonetta/tools/dat_creator.rb +57 -0
  53. data/lib/bayonetta/tools/dat_extractor.rb +94 -0
  54. data/lib/bayonetta/tools/dat_ls.rb +106 -0
  55. data/lib/bayonetta/tools/eff_idd_creator.rb +66 -0
  56. data/lib/bayonetta/tools/eff_idd_extractor.rb +73 -0
  57. data/lib/bayonetta/tools/exp_convert_wiiu_pc.rb +33 -0
  58. data/lib/bayonetta/tools/exp_tool.rb +48 -0
  59. data/lib/bayonetta/tools/mot_convert_wiiu_pc.rb +33 -0
  60. data/lib/bayonetta/tools/mot_tool.rb +60 -0
  61. data/lib/bayonetta/tools/pkz_extractor.rb +75 -0
  62. data/lib/bayonetta/tools/scr_creator.rb +63 -0
  63. data/lib/bayonetta/tools/scr_extractor.rb +78 -0
  64. data/lib/bayonetta/tools/wmb_cleanup.rb +250 -0
  65. data/lib/bayonetta/tools/wmb_common_bones.rb +45 -0
  66. data/lib/bayonetta/tools/wmb_convert_pc_switch.rb +35 -0
  67. data/lib/bayonetta/tools/wmb_convert_wiiu_pc.rb +33 -0
  68. data/lib/bayonetta/tools/wmb_export_assimp.rb +479 -0
  69. data/lib/bayonetta/tools/wmb_get_bone_map.rb +50 -0
  70. data/lib/bayonetta/tools/wmb_import_assimp.rb +735 -0
  71. data/lib/bayonetta/tools/wmb_import_geometry_wiiu_pc.rb +472 -0
  72. data/lib/bayonetta/tools/wmb_import_nier.rb +309 -0
  73. data/lib/bayonetta/tools/wtb_convert_wiiu_pc.rb +95 -0
  74. data/lib/bayonetta/tools/wtb_import_textures.rb +103 -0
  75. data/lib/bayonetta/tools/wtx_creator.rb +69 -0
  76. data/lib/bayonetta/tools/wtx_extractor.rb +85 -0
  77. data/lib/bayonetta/vertex_types.yaml +213 -0
  78. data/lib/bayonetta/vertex_types2.yaml +164 -0
  79. data/lib/bayonetta/vertex_types_nier.yaml +145 -0
  80. data/lib/bayonetta/wmb.rb +2443 -0
  81. data/lib/bayonetta/wmb3.rb +759 -0
  82. data/lib/bayonetta/wtb.rb +481 -0
  83. data/lib/bayonetta.rb +60 -0
  84. metadata +254 -0
@@ -0,0 +1,416 @@
1
+ module Bayonetta
2
+
3
+ module Linalg
4
+
5
+ class Matrix
6
+ attr_reader :data
7
+ def initialize
8
+ @data = [[1.0, 0.0, 0.0, 0.0],
9
+ [0.0, 1.0, 0.0, 0.0],
10
+ [0.0, 0.0, 1.0, 0.0],
11
+ [0.0, 0.0, 0.0, 1.0]]
12
+ end
13
+
14
+ def [](i)
15
+ @data[i]
16
+ end
17
+
18
+ def transpose
19
+ m = Matrix::new
20
+ 4.times { |i|
21
+ 4.times { |j|
22
+ m.data[i][j] = data[j][i]
23
+ }
24
+ }
25
+ m
26
+ end
27
+
28
+ def inverse
29
+ m = Matrix::new
30
+ s0 = data[0][0] * data[1][1] - data[1][0] * data[0][1]
31
+ s1 = data[0][0] * data[1][2] - data[1][0] * data[0][2]
32
+ s2 = data[0][0] * data[1][3] - data[1][0] * data[0][3]
33
+ s3 = data[0][1] * data[1][2] - data[1][1] * data[0][2]
34
+ s4 = data[0][1] * data[1][3] - data[1][1] * data[0][3]
35
+ s5 = data[0][2] * data[1][3] - data[1][2] * data[0][3]
36
+
37
+ c5 = data[2][2] * data[3][3] - data[3][2] * data[2][3]
38
+ c4 = data[2][1] * data[3][3] - data[3][1] * data[2][3]
39
+ c3 = data[2][1] * data[3][2] - data[3][1] * data[2][2]
40
+ c2 = data[2][0] * data[3][3] - data[3][0] * data[2][3]
41
+ c1 = data[2][0] * data[3][2] - data[3][0] * data[2][2]
42
+ c0 = data[2][0] * data[3][1] - data[3][0] * data[2][1]
43
+
44
+ invdet = 1.0 / (s0 * c5 - s1 * c4 + s2 * c3 + s3 * c2 - s4 * c1 + s5 * c0)
45
+ m.data[0][0] = ( data[1][1] * c5 - data[1][2] * c4 + data[1][3] * c3) * invdet
46
+ m.data[0][1] = (-data[0][1] * c5 + data[0][2] * c4 - data[0][3] * c3) * invdet
47
+ m.data[0][2] = ( data[3][1] * s5 - data[3][2] * s4 + data[3][3] * s3) * invdet
48
+ m.data[0][3] = (-data[2][1] * s5 + data[2][2] * s4 - data[2][3] * s3) * invdet
49
+
50
+ m.data[1][0] = (-data[1][0] * c5 + data[1][2] * c2 - data[1][3] * c1) * invdet
51
+ m.data[1][1] = ( data[0][0] * c5 - data[0][2] * c2 + data[0][3] * c1) * invdet
52
+ m.data[1][2] = (-data[3][0] * s5 + data[3][2] * s2 - data[3][3] * s1) * invdet
53
+ m.data[1][3] = ( data[2][0] * s5 - data[2][2] * s2 + data[2][3] * s1) * invdet
54
+
55
+ m.data[2][0] = ( data[1][0] * c4 - data[1][1] * c2 + data[1][3] * c0) * invdet
56
+ m.data[2][1] = (-data[0][0] * c4 + data[0][1] * c2 - data[0][3] * c0) * invdet
57
+ m.data[2][2] = ( data[3][0] * s4 - data[3][1] * s2 + data[3][3] * s0) * invdet
58
+ m.data[2][3] = (-data[2][0] * s4 + data[2][1] * s2 - data[2][3] * s0) * invdet
59
+
60
+ m.data[3][0] = (-data[1][0] * c3 + data[1][1] * c1 - data[1][2] * c0) * invdet
61
+ m.data[3][1] = ( data[0][0] * c3 - data[0][1] * c1 + data[0][2] * c0) * invdet
62
+ m.data[3][2] = (-data[3][0] * s3 + data[3][1] * s1 - data[3][2] * s0) * invdet
63
+ m.data[3][3] = ( data[2][0] * s3 - data[2][1] * s1 + data[2][2] * s0) * invdet
64
+ m
65
+ end
66
+
67
+ def +(other)
68
+ if other.kind_of?(Matrix)
69
+ m = Matrix::new
70
+ 4.times { |i|
71
+ 4.times { |j|
72
+ m.data[i][j] = data[i][j] + other.data[i][j]
73
+ }
74
+ }
75
+ return m
76
+ else
77
+ raise "Invalid argument for matrix add: #{other.inspect}!"
78
+ end
79
+ end
80
+
81
+ def *(other)
82
+ if other.kind_of?(Matrix)
83
+ m = Matrix::new
84
+ 4.times { |i|
85
+ 4.times { |j|
86
+ m.data[i][j] = 0.0
87
+ 4.times { |k|
88
+ m.data[i][j] += data[i][k] * other.data[k][j]
89
+ }
90
+ }
91
+ }
92
+ return m
93
+ elsif other.kind_of?(Vector) || (other.kind_of?(Array) && other.length == 4)
94
+ return Vector::new(
95
+ @data[0][0] * other[0] + @data[0][1] * other[1] + @data[0][2] * other[2] + @data[0][3] * other[3],
96
+ @data[1][0] * other[0] + @data[1][1] * other[1] + @data[1][2] * other[2] + @data[1][3] * other[3],
97
+ @data[2][0] * other[0] + @data[2][1] * other[1] + @data[2][2] * other[2] + @data[2][3] * other[3],
98
+ @data[3][0] * other[0] + @data[3][1] * other[1] + @data[3][2] * other[2] + @data[3][3] * other[3]
99
+ )
100
+ elsif other.kind_of?(Numeric)
101
+ m = Matrix::new
102
+ 4.times { |i|
103
+ 4.times { |j|
104
+ m.data[i][j] = data[i][j] * other
105
+ }
106
+ }
107
+ return m
108
+ else
109
+ raise "Invalid argument for matrix miltiply: #{other.inspect}!"
110
+ end
111
+ end
112
+ end #Matrix
113
+
114
+ class Vector
115
+
116
+ def initialize(x=0.0, y=0.0, z=0.0, w=1.0)
117
+ @data = [x, y, z, w]
118
+ end
119
+
120
+ def [](i)
121
+ return @data[i]
122
+ end
123
+
124
+ def []=(i,v)
125
+ return @data[i]=v
126
+ end
127
+
128
+ def dup
129
+ self.class::new(x,y,z,w)
130
+ end
131
+
132
+ def x
133
+ @data[0]
134
+ end
135
+
136
+ def x=(v)
137
+ @data[0] = v
138
+ end
139
+
140
+ def y
141
+ @data[1]
142
+ end
143
+
144
+ def y=(v)
145
+ @data[1] = v
146
+ end
147
+
148
+ def z
149
+ @data[2]
150
+ end
151
+
152
+ def z=(v)
153
+ @data[2]=v
154
+ end
155
+
156
+ def w
157
+ @data[3]
158
+ end
159
+
160
+ def w=(v)
161
+ @data[3] = v
162
+ end
163
+
164
+ def -(other)
165
+ Vector::new(x-other.x, y-other.y, z-other.z, w)
166
+ end
167
+
168
+ def +(other)
169
+ Vector::new(x+other.x, y+other.y, z+other.z, w)
170
+ end
171
+
172
+ def *(scalar)
173
+ Vector::new(x*scalar, y*scalar, z*scalar, w)
174
+ end
175
+
176
+ def dot(other)
177
+ x*other.x + y*other.y + z*other.z
178
+ end
179
+
180
+ def -@
181
+ self.class::new(-x, -y, -z, w)
182
+ end
183
+
184
+ def length
185
+ Math.sqrt(x*x + y*y + z*z)
186
+ end
187
+
188
+ def normalize!
189
+ l = length
190
+ if l != 0.0 && ! l.nan?
191
+ @data[0] /= l
192
+ @data[1] /= l
193
+ @data[2] /= l
194
+ else
195
+ @data[0] = 0.0
196
+ @data[1] = 0.0
197
+ @data[2] = 0.0
198
+ end
199
+ self
200
+ end
201
+
202
+ def normalize
203
+ self.dup.normalize!
204
+ end
205
+
206
+ end #Vector
207
+
208
+ def self.get_translation_vector(*args)
209
+ if args.length == 1
210
+ v = args.first.dup
211
+ elsif args.length == 3
212
+ v = Vector::new(*args)
213
+ else
214
+ raise "Invalid translation arguments: #{args.inspect}!"
215
+ end
216
+ v
217
+ end
218
+
219
+ def self.get_translation_matrix(*args)
220
+ m = get_unit_matrix
221
+ v = get_translation_vector(*args)
222
+ m.data[0][3] = v[0]
223
+ m.data[1][3] = v[1]
224
+ m.data[2][3] = v[2]
225
+ m
226
+ end
227
+
228
+ def self.get_inverse_translation_matrix(*args)
229
+ m = get_unit_matrix
230
+ v = get_translation_vector(*args)
231
+ m.data[0][3] = -v[0]
232
+ m.data[1][3] = -v[1]
233
+ m.data[2][3] = -v[2]
234
+ m
235
+ end
236
+
237
+ def self.get_scaling_vector(*args)
238
+ if args.length == 1
239
+ v = args.first.dup
240
+ elsif args.length == 3
241
+ v = Vector::new(*args)
242
+ else
243
+ raise "Invalid translation arguments: #{args.inspect}!"
244
+ end
245
+ v
246
+ end
247
+
248
+ def self.get_scaling_matrix(*args)
249
+ m = get_unit_matrix
250
+ v = get_scaling_vector(*args)
251
+ m.data[0][0] = v[0]
252
+ m.data[1][1] = v[1]
253
+ m.data[2][2] = v[2]
254
+ m
255
+ end
256
+
257
+ def self.get_inverse_scaling_matrix(*args)
258
+ m = get_unit_matrix
259
+ v = get_scaling_vector(*args)
260
+ m.data[0][0] = 1.0/v[0]
261
+ m.data[1][1] = 1.0/v[1]
262
+ m.data[2][2] = 1.0/v[2]
263
+ m
264
+ end
265
+
266
+ def self.get_rotation_vector(*args)
267
+ if args.length == 1
268
+ v = args.first.dup
269
+ elsif args.length == 3
270
+ v = Vector::new(*args)
271
+ else
272
+ raise "Invalid translation arguments: #{args.inspect}!"
273
+ end
274
+ v
275
+ end
276
+
277
+ def self.get_rotation_matrix(*args, center: nil, order: nil)
278
+ v = get_rotation_vector(*args)
279
+ if center
280
+ vt = get_translation_vector(*[center].flatten)
281
+ mt1 = get_translation_matrix(-vt)
282
+ mt2 = get_translation_matrix(vt)
283
+ else
284
+ mt1 = get_unit_matrix
285
+ mt2 = get_unit_matrix
286
+ end
287
+ m = mt2
288
+ if order
289
+ case order
290
+ when 0
291
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
292
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
293
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
294
+ when 1
295
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
296
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
297
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
298
+ when 2
299
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
300
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
301
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
302
+ when 3
303
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
304
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
305
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
306
+ when 4
307
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
308
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
309
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
310
+ else
311
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
312
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
313
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
314
+ end
315
+ else
316
+ m = m * rotation_matrix( v[2], Vector::new(0.0, 0.0, 1.0))
317
+ m = m * rotation_matrix( v[1], Vector::new(0.0, 1.0, 0.0))
318
+ m = m * rotation_matrix( v[0], Vector::new(1.0, 0.0, 0.0))
319
+ end
320
+ m = m * mt1
321
+ m
322
+ end
323
+
324
+ def self.get_inverse_rotation_matrix(*args, center: nil, order: nil)
325
+ v = get_rotation_vector(*args)
326
+ if center
327
+ vt = get_translation_vector(*[center].flatten)
328
+ mt1 = get_translation_matrix(-vt)
329
+ mt2 = get_translation_matrix(vt)
330
+ else
331
+ mt1 = get_unit_matrix
332
+ mt2 = get_unit_matrix
333
+ end
334
+ m = mt2
335
+ if order
336
+ case order
337
+ when 0
338
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
339
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
340
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
341
+ when 1
342
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
343
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
344
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
345
+ when 2
346
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
347
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
348
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
349
+ when 3
350
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
351
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
352
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
353
+ when 4
354
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
355
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
356
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
357
+ else
358
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
359
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
360
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
361
+ end
362
+ else
363
+ m = m * rotation_matrix( -v[0], Vector::new(1.0, 0.0, 0.0))
364
+ m = m * rotation_matrix( -v[1], Vector::new(0.0, 1.0, 0.0))
365
+ m = m * rotation_matrix( -v[2], Vector::new(0.0, 0.0, 1.0))
366
+ end
367
+ m = m * mt1
368
+ m
369
+ end
370
+
371
+ def self.get_unit_matrix
372
+ Matrix::new
373
+ end
374
+
375
+ def self.get_zero_matrix
376
+ Matrix::new * 0.0
377
+ end
378
+
379
+ def self.get_transformation_matrix(translate, rotate, scale, parent_scale, order: nil)
380
+ get_translation_matrix(translate) *
381
+ get_inverse_scaling_matrix(parent_scale) *
382
+ get_rotation_matrix(rotate, order: order) *
383
+ get_scaling_matrix(scale)
384
+ end
385
+
386
+ def self.get_inverse_transformation_matrix(translate, rotate, scale, parent_scale, order: nil)
387
+ get_inverse_scaling_matrix(scale) *
388
+ get_inverse_rotation_matrix(rotate, order: order) *
389
+ get_scaling_matrix(parent_scale) *
390
+ get_inverse_translation_matrix(translate)
391
+ end
392
+
393
+ private
394
+
395
+ # https://en.wikipedia.org/wiki/Rotation_matrix#Axis_and_angle
396
+ def self.rotation_matrix(angle, vector)
397
+ v = vector.normalize
398
+ x = v[0]
399
+ y = v[1]
400
+ z = v[2]
401
+ c = Math::cos(angle)
402
+ d = 1 - c
403
+ s = Math::sin(angle)
404
+
405
+ m = Matrix::new
406
+
407
+ m.data.replace( [ [ x*x*d + c, x*y*d - z*s, x*z*d + y*s, 0.0],
408
+ [ y*x*d + z*s, y*y*d + c, y*z*d - x*s, 0.0],
409
+ [ z*x*d - y*s, z*y*d + x*s, z*z*d + c, 0.0],
410
+ [ 0.0, 0.0, 0.0, 1.0] ] )
411
+ m
412
+ end
413
+
414
+ end #Linalg
415
+
416
+ end #Bayonetta