diff --git a/lib/readResources.js b/lib/readResources.js index 52022cf0..c19c692a 100644 --- a/lib/readResources.js +++ b/lib/readResources.js @@ -64,27 +64,27 @@ function readResources(gltf, options) { } function readBuffer(gltf, buffer, options) { - return readResource(gltf, buffer, options) + return readResource(gltf, buffer, false, options) .then(function(data) { buffer.extras._pipeline.source = data; }); } function readImage(gltf, image, options) { - return readResource(gltf, image, options) + return readResource(gltf, image, true, options) .then(function(data) { image.extras._pipeline.source = data; }); } function readShader(gltf, shader, options) { - return readResource(gltf, shader, options) + return readResource(gltf, shader, true, options) .then(function(data) { shader.extras._pipeline.source = data.toString(); }); } -function readResource(gltf, object, options) { +function readResource(gltf, object, saveResourceId, options) { const uri = object.uri; delete object.uri; // Don't hold onto the uri, its contents will be stored in extras._pipeline.source @@ -98,19 +98,22 @@ function readResource(gltf, object, options) { if (defined(extensions)) { const khrBinaryGltf = extensions.KHR_binary_glTF; if (defined(khrBinaryGltf)) { - return Promise.resolve(readBufferView(gltf, khrBinaryGltf.bufferView)); + return Promise.resolve(readBufferView(gltf, khrBinaryGltf.bufferView, object, saveResourceId)); } } if (defined(object.bufferView)) { - return Promise.resolve(readBufferView(gltf, object.bufferView)); + return Promise.resolve(readBufferView(gltf, object.bufferView, object, saveResourceId)); } if (isDataUri(uri)) { return Promise.resolve(dataUriToBuffer(uri)); } - return readFile(object, uri, options); + return readFile(object, uri, saveResourceId, options); } -function readBufferView(gltf, bufferViewId) { +function readBufferView(gltf, bufferViewId, object, saveResourceId) { + if (saveResourceId) { + object.extras._pipeline.resourceId = bufferViewId; + } const bufferView = gltf.bufferViews[bufferViewId]; const buffer = gltf.buffers[bufferView.buffer]; const source = buffer.extras._pipeline.source; @@ -118,7 +121,7 @@ function readBufferView(gltf, bufferViewId) { return source.slice(byteOffset, byteOffset + bufferView.byteLength); } -function readFile(object, uri, options) { +function readFile(object, uri, saveResourceId, options) { const resourceDirectory = options.resourceDirectory; const hasResourceDirectory = defined(resourceDirectory); @@ -140,6 +143,10 @@ function readFile(object, uri, options) { object.name = path.basename(relativePath, extension); } + if (saveResourceId) { + object.extras._pipeline.resourceId = absolutePath; + } + object.extras._pipeline.absolutePath = absolutePath; object.extras._pipeline.relativePath = relativePath; return fsExtra.readFile(absolutePath); diff --git a/lib/writeResources.js b/lib/writeResources.js index e492b001..d734e254 100644 --- a/lib/writeResources.js +++ b/lib/writeResources.js @@ -119,9 +119,9 @@ function writeBufferView(gltf, object, writtenResourceMap) { delete object.uri; // If we've written this resource before, re-use the bufferView - const originalPathOrBufferView = defaultValue(object.extras._pipeline.absolutePath, object.bufferView); - if (defined(originalPathOrBufferView) && defined(writtenResourceMap[originalPathOrBufferView])) { - object.bufferView = writtenResourceMap[originalPathOrBufferView]; + const resourceId = object.extras._pipeline.resourceId; + if (defined(resourceId) && defined(writtenResourceMap[resourceId])) { + object.bufferView = writtenResourceMap[resourceId]; return; } @@ -132,8 +132,8 @@ function writeBufferView(gltf, object, writtenResourceMap) { object.bufferView = addBuffer(gltf, source); // Save the bufferView so we can re-use it later - if (defined(originalPathOrBufferView)) { - writtenResourceMap[originalPathOrBufferView] = object.bufferView; + if (defined(resourceId)) { + writtenResourceMap[resourceId] = object.bufferView; } } @@ -200,13 +200,12 @@ function getRelativePath(gltf, object, index, extension, options) { } function writeFile(gltf, object, index, extension, writtenResourceMap, options) { - const bufferView = object.bufferView; delete object.bufferView; // If we've written this resource before, re-use the uri - const originalPathOrBufferView = defaultValue(object.extras._pipeline.absolutePath, bufferView); - if (defined(originalPathOrBufferView) && defined(writtenResourceMap[originalPathOrBufferView])) { - object.uri = writtenResourceMap[originalPathOrBufferView]; + const resourceId = object.extras._pipeline.resourceId; + if (defined(resourceId) && defined(writtenResourceMap[resourceId])) { + object.uri = writtenResourceMap[resourceId]; return; } @@ -218,7 +217,7 @@ function writeFile(gltf, object, index, extension, writtenResourceMap, options) } // Save the uri so we can re-use it later - if (defined(originalPathOrBufferView)) { - writtenResourceMap[originalPathOrBufferView] = object.uri; + if (defined(resourceId)) { + writtenResourceMap[resourceId] = object.uri; } }