-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtm.vmd.js
84 lines (73 loc) · 2.44 KB
/
tm.vmd.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(function() {
tm.asset = tm.asset || {};
tm.define("tm.asset.VMD", {
superClass: "tm.event.EventDispatcher",
init: function(path) {
this.superInit();
this.vmd = null;
this.loadFromURL(path);
},
// URLからロード
loadFromURL: function(path) {
var that = this;
var req = new XMLHttpRequest();
req.open("GET", path, true);
req.responseType = "arraybuffer";
req.onload = function() {
var data = req.response;
that.loadFromData(data);
};
req.send(null);
},
//データからロード
loadFromData: function(data) {
this.vmd = VMDParser(data);
this.flare("load");
},
});
VMDParser = function(data) {
var dv = tm.DataViewEx(data);
var vmd = {};
vmd.metadata = {};
vmd.metadata.format = 'vmd';
var metadata = vmd.metadata;
// Header
metadata.magic = dv.getChars(30);
if (metadata.magic !== 'Vocaloid Motion Data 0002') {
console.warn("{0}はVMDじゃないよ".format(this.path));
vmd.result = "This File is not VMD.";
vmd.error = true;
}
metadata.name = dv.getSjisStrings(20);
// Motion
metadata.motionCount = dv.getUint32();
vmd.motions = [];
for (var i = 0; i < metadata.motionCount; i++) {
var m = {};
m.boneName = dv.getSjisStrings(15);
m.frameNum = dv.getUint32();
m.position = [dv.getFloat32(), dv.getFloat32(), dv.getFloat32()];
m.rotation = [dv.getFloat32(), dv.getFloat32(), dv.getFloat32(), dv.getFloat32()];
m.interpolation = [];
for ( var j = 0; j < 64; j++ ) {
m.interpolation.push(dv.getUint8());
}
vmd.motions.push(m);
}
// Morphing
metadata.morphCount = dv.getUint32();
vmd.morphs = [];
for (var i = 0; i < metadata.morphCount; i++) {
var m = {};
m.morphName = dv.getSjisStrings(15);
m.frameNum = dv.getUint32();
m.weight = dv.getFloat32();
vmd.morphs.push(m);
}
return vmd;
}
//ローダーに拡張子登録
tm.asset.Loader.register("vmd", function(path) {
return tm.asset.VMD(path);
});
})();