|
@@ -16,37 +16,37 @@ module BABYLON.GLTF2.Extensions {
|
|
return "MSFT_lod";
|
|
return "MSFT_lod";
|
|
}
|
|
}
|
|
|
|
|
|
- protected _traverseNode(loader: GLTFLoader, index: number, action: (node: IGLTFNode, index: number, parentNode: IGLTFNode) => boolean, parentNode: IGLTFNode): boolean {
|
|
|
|
- var node = loader._getArrayItem(loader._gltf.nodes, index, "Node");
|
|
|
|
- if (!node) {
|
|
|
|
- return true;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
|
|
+ protected _traverseNode(loader: GLTFLoader, context: string, node: IGLTFNode, action: (node: IGLTFNode, parentNode: IGLTFNode) => boolean, parentNode: IGLTFNode): boolean {
|
|
return this._loadExtension<IMSFTLOD>(node, (extension, onComplete) => {
|
|
return this._loadExtension<IMSFTLOD>(node, (extension, onComplete) => {
|
|
for (var i = extension.ids.length - 1; i >= 0; i--) {
|
|
for (var i = extension.ids.length - 1; i >= 0; i--) {
|
|
- loader._traverseNode(extension.ids[i], action, parentNode);
|
|
|
|
|
|
+ var lodNode = GLTFUtils.GetArrayItem(loader._gltf.nodes, extension.ids[i]);
|
|
|
|
+ if (!lodNode) {
|
|
|
|
+ throw new Error(context + ": Failed to find node " + extension.ids[i]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ loader._traverseNode(context, lodNode, action, parentNode);
|
|
}
|
|
}
|
|
|
|
|
|
- loader._traverseNode(index, action, parentNode);
|
|
|
|
|
|
+ loader._traverseNode(context, node, action, parentNode);
|
|
onComplete();
|
|
onComplete();
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- protected _loadNode(loader: GLTFLoader, node: IGLTFNode): boolean {
|
|
|
|
|
|
+ protected _loadNode(loader: GLTFLoader, context: string, node: IGLTFNode): boolean {
|
|
return this._loadExtension<IMSFTLOD>(node, (extension, onComplete) => {
|
|
return this._loadExtension<IMSFTLOD>(node, (extension, onComplete) => {
|
|
var nodes = [node.index, ...extension.ids].map(index => loader._gltf.nodes[index]);
|
|
var nodes = [node.index, ...extension.ids].map(index => loader._gltf.nodes[index]);
|
|
|
|
|
|
loader._addLoaderPendingData(node);
|
|
loader._addLoaderPendingData(node);
|
|
- this._loadNodeLOD(loader, nodes, nodes.length - 1, () => {
|
|
|
|
|
|
+ this._loadNodeLOD(loader, context, nodes, nodes.length - 1, () => {
|
|
loader._removeLoaderPendingData(node);
|
|
loader._removeLoaderPendingData(node);
|
|
onComplete();
|
|
onComplete();
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- private _loadNodeLOD(loader: GLTFLoader, nodes: IGLTFNode[], index: number, onComplete: () => void): void {
|
|
|
|
|
|
+ private _loadNodeLOD(loader: GLTFLoader, context: string, nodes: IGLTFNode[], index: number, onComplete: () => void): void {
|
|
loader._whenAction(() => {
|
|
loader._whenAction(() => {
|
|
- loader._loadNode(nodes[index]);
|
|
|
|
|
|
+ loader._loadNode(context, nodes[index]);
|
|
}, () => {
|
|
}, () => {
|
|
if (index !== nodes.length - 1) {
|
|
if (index !== nodes.length - 1) {
|
|
var previousNode = nodes[index + 1];
|
|
var previousNode = nodes[index + 1];
|
|
@@ -59,17 +59,17 @@ module BABYLON.GLTF2.Extensions {
|
|
}
|
|
}
|
|
|
|
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
- this._loadNodeLOD(loader, nodes, index - 1, onComplete);
|
|
|
|
|
|
+ this._loadNodeLOD(loader, context, nodes, index - 1, onComplete);
|
|
}, MSFTLOD.MinimalLODDelay);
|
|
}, MSFTLOD.MinimalLODDelay);
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- protected _loadMaterial(loader: GLTFLoader, material: IGLTFMaterial, assign: (babylonMaterial: Material, isNew: boolean) => void): boolean {
|
|
|
|
|
|
+ protected _loadMaterial(loader: GLTFLoader, context: string, material: IGLTFMaterial, assign: (babylonMaterial: Material, isNew: boolean) => void): boolean {
|
|
return this._loadExtension<IMSFTLOD>(material, (extension, onComplete) => {
|
|
return this._loadExtension<IMSFTLOD>(material, (extension, onComplete) => {
|
|
var materials = [material.index, ...extension.ids].map(index => loader._gltf.materials[index]);
|
|
var materials = [material.index, ...extension.ids].map(index => loader._gltf.materials[index]);
|
|
|
|
|
|
loader._addLoaderPendingData(material);
|
|
loader._addLoaderPendingData(material);
|
|
- this._loadMaterialLOD(loader, materials, materials.length - 1, assign, () => {
|
|
|
|
|
|
+ this._loadMaterialLOD(loader, context, materials, materials.length - 1, assign, () => {
|
|
material.extensions[this.name] = extension;
|
|
material.extensions[this.name] = extension;
|
|
loader._removeLoaderPendingData(material);
|
|
loader._removeLoaderPendingData(material);
|
|
onComplete();
|
|
onComplete();
|
|
@@ -77,8 +77,8 @@ module BABYLON.GLTF2.Extensions {
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
|
|
- private _loadMaterialLOD(loader: GLTFLoader, materials: IGLTFMaterial[], index: number, assign: (babylonMaterial: Material, isNew: boolean) => void, onComplete: () => void): void {
|
|
|
|
- loader._loadMaterial(materials[index], (babylonMaterial, isNew) => {
|
|
|
|
|
|
+ private _loadMaterialLOD(loader: GLTFLoader, context: string, materials: IGLTFMaterial[], index: number, assign: (babylonMaterial: Material, isNew: boolean) => void, onComplete: () => void): void {
|
|
|
|
+ loader._loadMaterial(context, materials[index], (babylonMaterial, isNew) => {
|
|
assign(babylonMaterial, isNew);
|
|
assign(babylonMaterial, isNew);
|
|
|
|
|
|
if (index === 0) {
|
|
if (index === 0) {
|
|
@@ -91,7 +91,7 @@ module BABYLON.GLTF2.Extensions {
|
|
loader._executeWhenRenderReady(() => {
|
|
loader._executeWhenRenderReady(() => {
|
|
BaseTexture.WhenAllReady(babylonMaterial.getActiveTextures(), () => {
|
|
BaseTexture.WhenAllReady(babylonMaterial.getActiveTextures(), () => {
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
- this._loadMaterialLOD(loader, materials, index - 1, assign, onComplete);
|
|
|
|
|
|
+ this._loadMaterialLOD(loader, context, materials, index - 1, assign, onComplete);
|
|
}, MSFTLOD.MinimalLODDelay);
|
|
}, MSFTLOD.MinimalLODDelay);
|
|
});
|
|
});
|
|
});
|
|
});
|