1 | import { DracoCompression } from "@babylonjs/core/Meshes/Compression/dracoCompression";
|
2 | import { VertexBuffer } from "@babylonjs/core/Meshes/buffer";
|
3 | import { Geometry } from "@babylonjs/core/Meshes/geometry";
|
4 | import { GLTFLoader, ArrayItem } from "../glTFLoader";
|
5 | var NAME = "KHR_draco_mesh_compression";
|
6 |
|
7 |
|
8 |
|
9 | var KHR_draco_mesh_compression = (function () {
|
10 |
|
11 | function KHR_draco_mesh_compression(loader) {
|
12 |
|
13 | this.name = NAME;
|
14 |
|
15 | this.enabled = DracoCompression.DecoderAvailable;
|
16 | this._loader = loader;
|
17 | }
|
18 |
|
19 | KHR_draco_mesh_compression.prototype.dispose = function () {
|
20 | if (this._dracoCompression) {
|
21 | this._dracoCompression.dispose();
|
22 | delete this._dracoCompression;
|
23 | }
|
24 | delete this._loader;
|
25 | };
|
26 |
|
27 | KHR_draco_mesh_compression.prototype._loadVertexDataAsync = function (context, primitive, babylonMesh) {
|
28 | var _this = this;
|
29 | return GLTFLoader.LoadExtensionAsync(context, primitive, this.name, function (extensionContext, extension) {
|
30 | if (primitive.mode != undefined) {
|
31 | if (primitive.mode !== 5 &&
|
32 | primitive.mode !== 4 ) {
|
33 | throw new Error(context + ": Unsupported mode " + primitive.mode);
|
34 | }
|
35 |
|
36 | if (primitive.mode === 5 ) {
|
37 | throw new Error(context + ": Mode " + primitive.mode + " is not currently supported");
|
38 | }
|
39 | }
|
40 | var attributes = {};
|
41 | var loadAttribute = function (name, kind) {
|
42 | var uniqueId = extension.attributes[name];
|
43 | if (uniqueId == undefined) {
|
44 | return;
|
45 | }
|
46 | babylonMesh._delayInfo = babylonMesh._delayInfo || [];
|
47 | if (babylonMesh._delayInfo.indexOf(kind) === -1) {
|
48 | babylonMesh._delayInfo.push(kind);
|
49 | }
|
50 | attributes[kind] = uniqueId;
|
51 | };
|
52 | loadAttribute("POSITION", VertexBuffer.PositionKind);
|
53 | loadAttribute("NORMAL", VertexBuffer.NormalKind);
|
54 | loadAttribute("TANGENT", VertexBuffer.TangentKind);
|
55 | loadAttribute("TEXCOORD_0", VertexBuffer.UVKind);
|
56 | loadAttribute("TEXCOORD_1", VertexBuffer.UV2Kind);
|
57 | loadAttribute("JOINTS_0", VertexBuffer.MatricesIndicesKind);
|
58 | loadAttribute("WEIGHTS_0", VertexBuffer.MatricesWeightsKind);
|
59 | loadAttribute("COLOR_0", VertexBuffer.ColorKind);
|
60 | var bufferView = ArrayItem.Get(extensionContext, _this._loader.gltf.bufferViews, extension.bufferView);
|
61 | if (!bufferView._dracoBabylonGeometry) {
|
62 | bufferView._dracoBabylonGeometry = _this._loader.loadBufferViewAsync("#/bufferViews/" + bufferView.index, bufferView).then(function (data) {
|
63 | if (!_this._dracoCompression) {
|
64 | _this._dracoCompression = new DracoCompression();
|
65 | }
|
66 | return _this._dracoCompression.decodeMeshAsync(data, attributes).then(function (babylonVertexData) {
|
67 | var babylonGeometry = new Geometry(babylonMesh.name, _this._loader.babylonScene);
|
68 | babylonVertexData.applyToGeometry(babylonGeometry);
|
69 | return babylonGeometry;
|
70 | }).catch(function (error) {
|
71 | throw new Error(context + ": " + error.message);
|
72 | });
|
73 | });
|
74 | }
|
75 | return bufferView._dracoBabylonGeometry;
|
76 | });
|
77 | };
|
78 | return KHR_draco_mesh_compression;
|
79 | }());
|
80 | export { KHR_draco_mesh_compression };
|
81 | GLTFLoader.RegisterExtension(NAME, function (loader) { return new KHR_draco_mesh_compression(loader); });
|
82 |
|
\ | No newline at end of file |