From 7cb47ac9fb54a5b7e5ce43a92b1d6ae2d7b9490f Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 19 Aug 2016 11:22:33 -0400 Subject: [PATCH 01/20] Added make composite tile utility --- generator/bin/makeCompositeTile.js | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 generator/bin/makeCompositeTile.js diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js new file mode 100644 index 00000000..094b4610 --- /dev/null +++ b/generator/bin/makeCompositeTile.js @@ -0,0 +1,54 @@ +#!/usr/bin/env node +'use strict'; + +var Promise = require('bluebird'); +var defined = require('defined'); +var fs = require('fs-extra'); + +var argv = require('yargs') + .usage('Usage: $0 \ [options]') + .example('$0 batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt') + .alias('o', 'output') + .nargs('o', 1) + .describe('o', 'Output path where the composite tile should be written') + .help('h') + .alias('h', 'help') + .demand(1) + .argv; + +var fsReadFile = Promise.promisify(fs.readFile); +var fsOutputFile = Promise.promisify(fs.outputFile); + +var outputPath = argv.o; +if (!defined(outputPath)) { + outputPath = 'output/composite.cmpt'; +} + +var tilePaths = argv._; + +Promise.map(tilePaths, function(tilePath) { + return fsReadFile(tilePath); +}) + .then(function(tiles) { + var header = new Buffer(16); + var buffers = []; + buffers.push(header); + var byteLength = header.length; + for (var i = 0; i < tiles.length; i++) { + var tile = tiles[i]; + // Byte align all tiles to 4 bytes + var tilePadding = tile.length % 4; + if (tilePadding !== 0) { + tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); + } + tile.writeUInt32LE(tile.length, 8); //byteLength + byteLength += tile.length; + buffers.push(tile); + } + header.write('cmpt', 0); // magic + header.writeUInt32LE(1, 4); // version + header.writeUInt32LE(byteLength, 8); // byteLength + header.writeUInt32LE(tiles.length, 12); // tilesLength + return fsOutputFile(outputPath, Buffer.concat(buffers)); + }); + From 180365a4018405d5fc8105bf97207183169b2c04 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 19 Aug 2016 11:25:39 -0400 Subject: [PATCH 02/20] Updated packages --- generator/package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/generator/package.json b/generator/package.json index 22ff66e6..35dcdf9a 100644 --- a/generator/package.json +++ b/generator/package.json @@ -23,10 +23,11 @@ }, "dependencies": { "bluebird": "3.4.1", - "cesium": "1.24" + "cesium": "1.24", + "fs-extra": "0.30.0", + "yargs": "5.0.0" }, "devDependencies": { - "fs-extra": "0.30.0", "gulp": "3.9.1", "gulp-jshint": "2.0.1", "istanbul": "0.4.4", @@ -36,8 +37,7 @@ "jshint-stylish": "2.2.0", "open": "0.0.5", "request": "2.74.0", - "requirejs": "2.2.0", - "yargs": "4.8.1" + "requirejs": "2.2.0" }, "scripts": { "jsHint": "gulp jsHint", From e19651f47fa3f8e6659dacdfbd82d499ad3f8397 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 19 Aug 2016 11:25:50 -0400 Subject: [PATCH 03/20] Use Cesium.defined --- generator/bin/makeCompositeTile.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js index 094b4610..f80bdb1f 100644 --- a/generator/bin/makeCompositeTile.js +++ b/generator/bin/makeCompositeTile.js @@ -1,10 +1,12 @@ #!/usr/bin/env node 'use strict'; +var Cesium = require('cesium'); var Promise = require('bluebird'); -var defined = require('defined'); var fs = require('fs-extra'); +var defined = Cesium.defined; + var argv = require('yargs') .usage('Usage: $0 \ [options]') .example('$0 batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt') From 69ba157ee905de128e8496c893127ba3153bc257 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 19 Aug 2016 11:26:43 -0400 Subject: [PATCH 04/20] Comment formatting --- generator/bin/makeCompositeTile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js index f80bdb1f..f15d5e27 100644 --- a/generator/bin/makeCompositeTile.js +++ b/generator/bin/makeCompositeTile.js @@ -43,7 +43,7 @@ Promise.map(tilePaths, function(tilePath) { if (tilePadding !== 0) { tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); } - tile.writeUInt32LE(tile.length, 8); //byteLength + tile.writeUInt32LE(tile.length, 8); // byteLength byteLength += tile.length; buffers.push(tile); } From dc410fc64f1039f21e30f5b1f86ac1f0fb32367b Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Wed, 24 Aug 2016 17:32:11 -0400 Subject: [PATCH 05/20] Fleshed out makeCompositeTile with tests and README --- generator/README.md | 18 +++- generator/bin/makeCompositeTile.js | 33 ++++---- generator/lib/isGzipped.js | 22 +++++ generator/lib/readTile.js | 39 +++++++++ generator/lib/writeTile.js | 47 +++++++++++ generator/package.json | 3 +- generator/specs/bin/makeCompositeTileSpec.js | 82 +++++++++++++++++++ generator/specs/data/justHeader.i3dm | Bin 0 -> 32 bytes generator/specs/data/justHeaderGzipped.i3dm | Bin 0 -> 50 bytes generator/specs/lib/isGzippedSpec.js | 24 ++++++ generator/specs/lib/readTileSpec.js | 27 ++++++ generator/specs/lib/writeTileSpec.js | 58 +++++++++++++ 12 files changed, 334 insertions(+), 19 deletions(-) create mode 100644 generator/lib/isGzipped.js create mode 100644 generator/lib/readTile.js create mode 100644 generator/lib/writeTile.js create mode 100644 generator/specs/bin/makeCompositeTileSpec.js create mode 100644 generator/specs/data/justHeader.i3dm create mode 100644 generator/specs/data/justHeaderGzipped.i3dm create mode 100644 generator/specs/lib/isGzippedSpec.js create mode 100644 generator/specs/lib/readTileSpec.js create mode 100644 generator/specs/lib/writeTileSpec.js diff --git a/generator/README.md b/generator/README.md index a9b613f6..6687a676 100644 --- a/generator/README.md +++ b/generator/README.md @@ -1 +1,17 @@ -Tools for generating sample 3D Tiles tilesets. \ No newline at end of file +Tools for generating sample 3D Tiles tilesets. + +# Make Composite Tile + +Creates a composite tile from multiple source tiles. + +## Example +`node ./bin/makeCompositeTile.js batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt` + +## Command-Line Flags + +| Flag | Description | Required | +| --- | --- | --- | +| `-o`, `--output` | Output path where the composite tile should be written. | No, default `output/composite.cmpt` | +| `-z`, `--gzip` | Gzip the output composite tile. | No, default `false` | + +All unflagged arguments are treated as source tiles to place in the composite tile. \ No newline at end of file diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js index f15d5e27..7312784e 100644 --- a/generator/bin/makeCompositeTile.js +++ b/generator/bin/makeCompositeTile.js @@ -1,35 +1,30 @@ #!/usr/bin/env node 'use strict'; - -var Cesium = require('cesium'); var Promise = require('bluebird'); -var fs = require('fs-extra'); - -var defined = Cesium.defined; var argv = require('yargs') - .usage('Usage: $0 \ [options]') + .usage('Usage: $0 \ [options]') .example('$0 batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt') .alias('o', 'output') + .default('o', 'output/composite.cmpt') .nargs('o', 1) - .describe('o', 'Output path where the composite tile should be written') + .describe('o', 'Output path where the composite tile should be written.') + .boolean('z') + .alias('z', 'gzip') + .default('z', false) + .describe('z', 'Flag to gzip the output composite tile.') .help('h') .alias('h', 'help') .demand(1) .argv; -var fsReadFile = Promise.promisify(fs.readFile); -var fsOutputFile = Promise.promisify(fs.outputFile); - -var outputPath = argv.o; -if (!defined(outputPath)) { - outputPath = 'output/composite.cmpt'; -} +var readTile = require('../lib/readTile'); +var writeTile = require('../lib/writeTile'); var tilePaths = argv._; Promise.map(tilePaths, function(tilePath) { - return fsReadFile(tilePath); + return readTile(tilePath); }) .then(function(tiles) { var header = new Buffer(16); @@ -51,6 +46,10 @@ Promise.map(tilePaths, function(tilePath) { header.writeUInt32LE(1, 4); // version header.writeUInt32LE(byteLength, 8); // byteLength header.writeUInt32LE(tiles.length, 12); // tilesLength - return fsOutputFile(outputPath, Buffer.concat(buffers)); + var buffer = Buffer.concat(buffers); + var options = {}; + if (argv.z) { + options.gzip = true; + } + return writeTile(outputPath, buffer, options); }); - diff --git a/generator/lib/isGzipped.js b/generator/lib/isGzipped.js new file mode 100644 index 00000000..bd61ed27 --- /dev/null +++ b/generator/lib/isGzipped.js @@ -0,0 +1,22 @@ +'use strict'; +var Cesium = require('cesium'); + +var DeveloperError = Cesium.DeveloperError; +var defined = Cesium.defined; + +module.exports = isGzipped; + +/** + * Test if the provided data is gzipped. + * + * @param {Buffer} data A buffer containing the data to test. + * @returns {Boolean} True if the data is gzipped, False if not. + * + * @throws {DeveloperError} Will throw an error if data is undefined. + */ +function isGzipped(data) { + if (!defined(data)) { + throw new DeveloperError('data must be defined.'); + } + return data[0] === 0x1f && data[1] === 0x8b; +} \ No newline at end of file diff --git a/generator/lib/readTile.js b/generator/lib/readTile.js new file mode 100644 index 00000000..8ee8547b --- /dev/null +++ b/generator/lib/readTile.js @@ -0,0 +1,39 @@ +'use strict'; +var Cesium = require('cesium'); +var Promise = require('bluebird'); +var fs = require('fs-extra'); +var zlib = require('zlib'); + +var DeveloperError = Cesium.DeveloperError; +var defined = Cesium.defined; + +var isGzipped = require('./isGzipped'); + +var fsReadFile = Promise.promisify(fs.readFile); +var zlibGunzip = Promise.promisify(zlib.gunzip); + +module.exports = readTile; + +/** + * Reads tile data from a file. + * + * @param {String} filePath The file path to read from. + * @returns {Promise} A promise that resolves with the data when the read operation completes. + * + * @throws {DeveloperError} Will throw an error if filePath is undefined. + */ +function readTile(filePath) { + return Promise.resolve() + .then(function() { + if (!defined(filePath)) { + throw new DeveloperError('filePath must be defined'); + } + return fsReadFile(filePath); + }) + .then(function(buffer) { + if (isGzipped(buffer)) { + return zlibGunzip(buffer, undefined); + } + return buffer; + }); +} \ No newline at end of file diff --git a/generator/lib/writeTile.js b/generator/lib/writeTile.js new file mode 100644 index 00000000..ec94e7f7 --- /dev/null +++ b/generator/lib/writeTile.js @@ -0,0 +1,47 @@ +'use strict'; +var Cesium = require('cesium'); +var Promise = require('bluebird'); +var fs = require('fs-extra'); +var zlib = require('zlib'); + +var DeveloperError = Cesium.DeveloperError; +var defaultValue = Cesium.defaultValue; +var defined = Cesium.defined; + +var fsOutputFile = Promise.promisify(fs.outputFile); +var zlibGzip = Promise.promisify(zlib.gzip); + +module.exports = writeTile; + +/** + * Writes the tile data to a file. + * + * @param {String} filePath The file path where the tile should be written. + * @param {Buffer} tileData A buffer containing the tile data to write. + * @param {Object} [options] Defines custom behavior for writing. + * @param {Boolean} [options.gzip=false] Flag to gzip the buffer data before writing. + * @returns {Promise} A promise that resolves when the write operation completes. + * + * @throws {DeveloperError} Throws an error if filePath is undefined. + * @throws {DeveloperError} Throws an error if tileData is undefined. + */ +function writeTile(filePath, tileData, options) { + return Promise.resolve() + .then(function() { + if (!defined(filePath)) { + throw new DeveloperError('filePath must be defined.'); + } + if (!defined(tileData)) { + throw new DeveloperError('tileData must be defined.'); + } + options = defaultValue(options, {}); + var gzip = defaultValue(options.gzip, false); + if (gzip) { + return zlibGzip(tileData, undefined); + } + return Promise.resolve(tileData); + }) + .then(function(buffer) { + return fsOutputFile(filePath, buffer); + }); +} \ No newline at end of file diff --git a/generator/package.json b/generator/package.json index 35dcdf9a..11fe685f 100644 --- a/generator/package.json +++ b/generator/package.json @@ -37,7 +37,8 @@ "jshint-stylish": "2.2.0", "open": "0.0.5", "request": "2.74.0", - "requirejs": "2.2.0" + "requirejs": "2.2.0", + "rimraf": "2.5.4" }, "scripts": { "jsHint": "gulp jsHint", diff --git a/generator/specs/bin/makeCompositeTileSpec.js b/generator/specs/bin/makeCompositeTileSpec.js new file mode 100644 index 00000000..857185ee --- /dev/null +++ b/generator/specs/bin/makeCompositeTileSpec.js @@ -0,0 +1,82 @@ +'use strict'; +var Promise = require('bluebird'); +var childProcess = require('child_process'); +var fs = require('fs-extra'); +var rimraf = require('rimraf'); + +var isGzipped = require('../../lib/isGzipped'); + +var fsReadFile = Promise.promisify(fs.readFile); +var rimrafAsync = Promise.promisify(rimraf); + +var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; +var justHeaderGzippedI3dmPath = './specs/data/justHeaderGzipped.i3dm'; +var testOutputPath = './specs/data/.test/'; + +describe('makeCompositeTile', function() { + afterAll(function(done) { + rimrafAsync(testOutputPath, {}) + .then(done); + }); + + it('makes a composite tile', function(done) { + var outputPath = testOutputPath + 'composite.cmpt'; + expect(makeCompositeTile([justHeaderI3dmPath, justHeaderI3dmPath, '-o', outputPath]) + .then(function() { + return fsReadFile(outputPath); + }) + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + var byteLength = 16 + 32 + 32; + expect(tileData.length).toBe(byteLength); + expect(magic).toEqual('cmpt'); // magic + expect(tileData.readUInt32LE(4)).toBe(1); // version + expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength + expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength + var tileMagic = tileData.toString('utf8', 16, 20); + expect(tileMagic).toEqual('i3dm'); + }), done).toResolve(); + }); + + it('makes a composite tile from gzipped tiles', function(done) { + var outputPath = testOutputPath + 'compositeFromGzipped.cmpt'; + expect(makeCompositeTile([justHeaderGzippedI3dmPath, justHeaderGzippedI3dmPath, '-o', outputPath]) + .then(function() { + return fsReadFile(outputPath); + }) + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + var byteLength = 16 + 32 + 32; + expect(tileData.length).toBe(byteLength); + expect(magic).toEqual('cmpt'); // magic + expect(tileData.readUInt32LE(4)).toBe(1); // version + expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength + expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength + var tileMagic = tileData.toString('utf8', 16, 20); + expect(tileMagic).toEqual('i3dm'); + }), done).toResolve(); + }); + + it('makes a gzipped composite tile', function(done) { + var outputPath = testOutputPath + 'compositeGzipped.cmpt'; + expect(makeCompositeTile([justHeaderI3dmPath, justHeaderI3dmPath, '-o', outputPath, '-z']) + .then(function() { + return fsReadFile(outputPath); + }) + .then(function(tileData) { + expect(isGzipped(tileData)).toBeTruthy(); + }), done).toResolve(); + }); +}); + +function makeCompositeTile(args) { + var makeCompositeTileProcess = childProcess.fork('./bin/makeCompositeTile', args); + return new Promise(function(resolve, reject) { + makeCompositeTileProcess.on('close', function() { + resolve(); + }); + makeCompositeTileProcess.on('error', function() { + reject(); + }); + }); +} \ No newline at end of file diff --git a/generator/specs/data/justHeader.i3dm b/generator/specs/data/justHeader.i3dm new file mode 100644 index 0000000000000000000000000000000000000000..43627d9ebd52b54798fb8c5137b75416307d4971 GIT binary patch literal 32 Vcmc~aPRV6pU|NuU;k1e0$<%~|1ePRLHlG6=3 Date: Wed, 24 Aug 2016 17:34:38 -0400 Subject: [PATCH 06/20] jsHint fix --- generator/bin/makeCompositeTile.js | 1 + 1 file changed, 1 insertion(+) diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js index 7312784e..85b24238 100644 --- a/generator/bin/makeCompositeTile.js +++ b/generator/bin/makeCompositeTile.js @@ -22,6 +22,7 @@ var readTile = require('../lib/readTile'); var writeTile = require('../lib/writeTile'); var tilePaths = argv._; +var outputPath = argv.o; Promise.map(tilePaths, function(tilePath) { return readTile(tilePath); From 36cb38e0162a65612a61138696da850c8d5ec874 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Thu, 25 Aug 2016 11:36:13 -0400 Subject: [PATCH 07/20] Separated makeCompositeTile into a lib function of the same name, and added tests --- generator/bin/makeCompositeTile.js | 24 ++------------- generator/lib/makeCompositeTile.js | 32 ++++++++++++++++++++ generator/specs/bin/makeCompositeTileSpec.js | 4 ++- generator/specs/lib/makeCompositeTileSpec.js | 28 +++++++++++++++++ 4 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 generator/lib/makeCompositeTile.js create mode 100644 generator/specs/lib/makeCompositeTileSpec.js diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js index 85b24238..a4948269 100644 --- a/generator/bin/makeCompositeTile.js +++ b/generator/bin/makeCompositeTile.js @@ -5,6 +5,7 @@ var Promise = require('bluebird'); var argv = require('yargs') .usage('Usage: $0 \ [options]') .example('$0 batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt') + .example('$0 *.b3dm -o output/composite.cmpt') .alias('o', 'output') .default('o', 'output/composite.cmpt') .nargs('o', 1) @@ -18,6 +19,7 @@ var argv = require('yargs') .demand(1) .argv; +var makeCompositeTile = require('../lib/makeCompositeTile'); var readTile = require('../lib/readTile'); var writeTile = require('../lib/writeTile'); @@ -28,29 +30,9 @@ Promise.map(tilePaths, function(tilePath) { return readTile(tilePath); }) .then(function(tiles) { - var header = new Buffer(16); - var buffers = []; - buffers.push(header); - var byteLength = header.length; - for (var i = 0; i < tiles.length; i++) { - var tile = tiles[i]; - // Byte align all tiles to 4 bytes - var tilePadding = tile.length % 4; - if (tilePadding !== 0) { - tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); - } - tile.writeUInt32LE(tile.length, 8); // byteLength - byteLength += tile.length; - buffers.push(tile); - } - header.write('cmpt', 0); // magic - header.writeUInt32LE(1, 4); // version - header.writeUInt32LE(byteLength, 8); // byteLength - header.writeUInt32LE(tiles.length, 12); // tilesLength - var buffer = Buffer.concat(buffers); var options = {}; if (argv.z) { options.gzip = true; } - return writeTile(outputPath, buffer, options); + return writeTile(outputPath, makeCompositeTile(tiles), options); }); diff --git a/generator/lib/makeCompositeTile.js b/generator/lib/makeCompositeTile.js new file mode 100644 index 00000000..9d9037ba --- /dev/null +++ b/generator/lib/makeCompositeTile.js @@ -0,0 +1,32 @@ +'use strict'; + +module.exports = makeCompositeTile; + +/** + * Combines an array of tile buffers into a single composite tile. + * + * @param {Array.} tileBuffers An array of buffers holding tile data. + * @returns {Buffer} A single buffer holding the composite tile. + */ +function makeCompositeTile(tileBuffers) { + var header = new Buffer(16); + var buffers = []; + buffers.push(header); + var byteLength = header.length; + for (var i = 0; i < tileBuffers.length; i++) { + var tile = tileBuffers[i]; + // Byte align all tiles to 4 bytes + var tilePadding = tile.length % 4; + if (tilePadding !== 0) { + tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); + } + tile.writeUInt32LE(tile.length, 8); // byteLength + byteLength += tile.length; + buffers.push(tile); + } + header.write('cmpt', 0); // magic + header.writeUInt32LE(1, 4); // version + header.writeUInt32LE(byteLength, 8); // byteLength + header.writeUInt32LE(tileBuffers.length, 12); // tilesLength + return Buffer.concat(buffers); +} \ No newline at end of file diff --git a/generator/specs/bin/makeCompositeTileSpec.js b/generator/specs/bin/makeCompositeTileSpec.js index 857185ee..c9d0850a 100644 --- a/generator/specs/bin/makeCompositeTileSpec.js +++ b/generator/specs/bin/makeCompositeTileSpec.js @@ -13,7 +13,7 @@ var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; var justHeaderGzippedI3dmPath = './specs/data/justHeaderGzipped.i3dm'; var testOutputPath = './specs/data/.test/'; -describe('makeCompositeTile', function() { +describe('makeCompositeTile cli', function() { afterAll(function(done) { rimrafAsync(testOutputPath, {}) .then(done); @@ -35,6 +35,8 @@ describe('makeCompositeTile', function() { expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength var tileMagic = tileData.toString('utf8', 16, 20); expect(tileMagic).toEqual('i3dm'); + tileMagic = tileData.toString('utf8', 48, 52); + expect(tileMagic).toEqual('i3dm'); }), done).toResolve(); }); diff --git a/generator/specs/lib/makeCompositeTileSpec.js b/generator/specs/lib/makeCompositeTileSpec.js new file mode 100644 index 00000000..26706d82 --- /dev/null +++ b/generator/specs/lib/makeCompositeTileSpec.js @@ -0,0 +1,28 @@ +'use strict'; + +var makeCompositeTile = require('../../lib/makeCompositeTile'); +var readTile = require('../../lib/readTile'); +var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; + +describe('makeCompositeTile', function() { + it('makes a composite tile', function(done) { + expect(readTile(justHeaderI3dmPath) + .then(function(tile) { + var tiles = [tile, tile]; + return makeCompositeTile(tiles); + }) + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + var byteLength = 16 + 32 + 32; + expect(tileData.length).toBe(byteLength); + expect(magic).toEqual('cmpt'); // magic + expect(tileData.readUInt32LE(4)).toBe(1); // version + expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength + expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength + var tileMagic = tileData.toString('utf8', 16, 20); + expect(tileMagic).toEqual('i3dm'); + tileMagic = tileData.toString('utf8', 48, 52); + expect(tileMagic).toEqual('i3dm'); + }), done).toResolve(); + }); +}); \ No newline at end of file From 5fb2426e2f399569f0304023915009a39f6cf591 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Thu, 25 Aug 2016 11:37:04 -0400 Subject: [PATCH 08/20] Aligned comments --- generator/lib/makeCompositeTile.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/generator/lib/makeCompositeTile.js b/generator/lib/makeCompositeTile.js index 9d9037ba..b9a1c5e0 100644 --- a/generator/lib/makeCompositeTile.js +++ b/generator/lib/makeCompositeTile.js @@ -20,13 +20,13 @@ function makeCompositeTile(tileBuffers) { if (tilePadding !== 0) { tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); } - tile.writeUInt32LE(tile.length, 8); // byteLength + tile.writeUInt32LE(tile.length, 8); // byteLength byteLength += tile.length; buffers.push(tile); } - header.write('cmpt', 0); // magic - header.writeUInt32LE(1, 4); // version - header.writeUInt32LE(byteLength, 8); // byteLength + header.write('cmpt', 0); // magic + header.writeUInt32LE(1, 4); // version + header.writeUInt32LE(byteLength, 8); // byteLength header.writeUInt32LE(tileBuffers.length, 12); // tilesLength return Buffer.concat(buffers); } \ No newline at end of file From d3f8ae8a659f106402b0a36d0ef7bd7945855b36 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Thu, 25 Aug 2016 11:41:05 -0400 Subject: [PATCH 09/20] Include order fixes --- generator/bin/makeCompositeTile.js | 7 +++---- generator/lib/readTile.js | 3 +-- generator/specs/bin/makeCompositeTileSpec.js | 1 - generator/specs/lib/isGzippedSpec.js | 1 - generator/specs/lib/makeCompositeTileSpec.js | 2 +- generator/specs/lib/writeTileSpec.js | 1 - 6 files changed, 5 insertions(+), 10 deletions(-) diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js index a4948269..862e1df8 100644 --- a/generator/bin/makeCompositeTile.js +++ b/generator/bin/makeCompositeTile.js @@ -1,6 +1,9 @@ #!/usr/bin/env node 'use strict'; var Promise = require('bluebird'); +var makeCompositeTile = require('../lib/makeCompositeTile'); +var readTile = require('../lib/readTile'); +var writeTile = require('../lib/writeTile'); var argv = require('yargs') .usage('Usage: $0 \ [options]') @@ -19,10 +22,6 @@ var argv = require('yargs') .demand(1) .argv; -var makeCompositeTile = require('../lib/makeCompositeTile'); -var readTile = require('../lib/readTile'); -var writeTile = require('../lib/writeTile'); - var tilePaths = argv._; var outputPath = argv.o; diff --git a/generator/lib/readTile.js b/generator/lib/readTile.js index 8ee8547b..82d3ec52 100644 --- a/generator/lib/readTile.js +++ b/generator/lib/readTile.js @@ -3,12 +3,11 @@ var Cesium = require('cesium'); var Promise = require('bluebird'); var fs = require('fs-extra'); var zlib = require('zlib'); +var isGzipped = require('./isGzipped'); var DeveloperError = Cesium.DeveloperError; var defined = Cesium.defined; -var isGzipped = require('./isGzipped'); - var fsReadFile = Promise.promisify(fs.readFile); var zlibGunzip = Promise.promisify(zlib.gunzip); diff --git a/generator/specs/bin/makeCompositeTileSpec.js b/generator/specs/bin/makeCompositeTileSpec.js index c9d0850a..d4792ae8 100644 --- a/generator/specs/bin/makeCompositeTileSpec.js +++ b/generator/specs/bin/makeCompositeTileSpec.js @@ -3,7 +3,6 @@ var Promise = require('bluebird'); var childProcess = require('child_process'); var fs = require('fs-extra'); var rimraf = require('rimraf'); - var isGzipped = require('../../lib/isGzipped'); var fsReadFile = Promise.promisify(fs.readFile); diff --git a/generator/specs/lib/isGzippedSpec.js b/generator/specs/lib/isGzippedSpec.js index 38ca6168..7ee86850 100644 --- a/generator/specs/lib/isGzippedSpec.js +++ b/generator/specs/lib/isGzippedSpec.js @@ -1,7 +1,6 @@ 'use strict'; var Promise = require('bluebird'); var zlib = require('zlib'); - var isGzipped = require('../../lib/isGzipped'); var zlibGzip = Promise.promisify(zlib.gzip); diff --git a/generator/specs/lib/makeCompositeTileSpec.js b/generator/specs/lib/makeCompositeTileSpec.js index 26706d82..4c2ad732 100644 --- a/generator/specs/lib/makeCompositeTileSpec.js +++ b/generator/specs/lib/makeCompositeTileSpec.js @@ -1,7 +1,7 @@ 'use strict'; - var makeCompositeTile = require('../../lib/makeCompositeTile'); var readTile = require('../../lib/readTile'); + var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; describe('makeCompositeTile', function() { diff --git a/generator/specs/lib/writeTileSpec.js b/generator/specs/lib/writeTileSpec.js index 01854245..f77804c2 100644 --- a/generator/specs/lib/writeTileSpec.js +++ b/generator/specs/lib/writeTileSpec.js @@ -2,7 +2,6 @@ var Promise = require('bluebird'); var fs = require('fs-extra'); var rimraf = require('rimraf'); - var isGzipped = require('../../lib/isGzipped'); var writeTile = require('../../lib/writeTile'); From 31bde95470344554a415cbcc7d99bce31609832f Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:19:09 -0400 Subject: [PATCH 10/20] Migrated writeCompositeTile from generator to tools --- tools/lib/getDefaultWriteCallback.js | 13 +-- tools/lib/getFilesInDirectory.js | 39 +++++++ tools/lib/gzipTileset.js | 113 ++++----------------- tools/lib/isGzipped.js | 23 +++-- tools/lib/isGzippedFile.js | 19 ++++ tools/lib/isTileFile.js | 13 +++ tools/lib/makeCompositeTile.js | 32 ++++++ tools/lib/readTile.js | 38 +++++++ tools/lib/runPipeline.js | 31 +++--- tools/lib/writeTile.js | 44 ++++++++ tools/specs/lib/getFilesInDirectorySpec.js | 74 ++++++++++++++ tools/specs/lib/gzipTilesetSpec.js | 57 +++++------ tools/specs/lib/isGzippedSpec.js | 23 +++++ tools/specs/lib/makeCompositeTileSpec.js | 28 +++++ tools/specs/lib/readTileSpec.js | 27 +++++ tools/specs/lib/runPipelineSpec.js | 6 +- tools/specs/lib/writeTileSpec.js | 57 +++++++++++ 17 files changed, 479 insertions(+), 158 deletions(-) create mode 100644 tools/lib/getFilesInDirectory.js create mode 100644 tools/lib/isGzippedFile.js create mode 100644 tools/lib/isTileFile.js create mode 100644 tools/lib/makeCompositeTile.js create mode 100644 tools/lib/readTile.js create mode 100644 tools/lib/writeTile.js create mode 100644 tools/specs/lib/getFilesInDirectorySpec.js create mode 100644 tools/specs/lib/isGzippedSpec.js create mode 100644 tools/specs/lib/makeCompositeTileSpec.js create mode 100644 tools/specs/lib/readTileSpec.js create mode 100644 tools/specs/lib/writeTileSpec.js diff --git a/tools/lib/getDefaultWriteCallback.js b/tools/lib/getDefaultWriteCallback.js index c5289e09..c07b32d0 100644 --- a/tools/lib/getDefaultWriteCallback.js +++ b/tools/lib/getDefaultWriteCallback.js @@ -1,18 +1,13 @@ 'use strict'; -var fsExtra = require('fs-extra'); -var path = require('path'); -var Promise = require('bluebird'); - -var fsExtraOutputFile = Promise.promisify(fsExtra.outputFile); +var writeTile = require('./writeTile'); module.exports = getDefaultWriteCallback; /** * @private */ -function getDefaultWriteCallback(outputDirectory) { - return function(file, data) { - var outputFile = path.join(outputDirectory, file); - return fsExtraOutputFile(outputFile, data); +function getDefaultWriteCallback() { + return function(file, data, options) { + return writeTile(file, data, options); }; } diff --git a/tools/lib/getFilesInDirectory.js b/tools/lib/getFilesInDirectory.js new file mode 100644 index 00000000..98e89492 --- /dev/null +++ b/tools/lib/getFilesInDirectory.js @@ -0,0 +1,39 @@ +'use strict'; +var Cesium = require('cesium'); +var Promise = require('bluebird'); +var fs = require('fs'); +var path = require('path'); + +var fsReaddir = Promise.promisify(fs.readdir); +var fsStat = Promise.promisify(fs.stat); + +var defaultValue = Cesium.defaultValue; + +module.exports = getFilesInDirectory; + +function getFilesInDirectory(directory, options) { + var files = []; + options = defaultValue(options, {}); + var recursive = defaultValue(options.recursive, false); + var filter = defaultValue(options.filter, function(path) { + return true; + }); + return findFiles(directory, files, recursive, filter); +} + +function findFiles(directory, files, recursive, filter) { + return fsReaddir(directory).map(function(fileName) { + var fullPath = path.join(directory, fileName); + return fsStat(fullPath) + .then(function(stats) { + if (stats.isFile() && filter(fullPath)) { + files.push(fullPath); + } else if (recursive && stats.isDirectory()) { + return findFiles(fullPath, files, recursive, filter); + } + }); + }) + .then(function() { + return files; + }) +} \ No newline at end of file diff --git a/tools/lib/gzipTileset.js b/tools/lib/gzipTileset.js index 4bde853c..d3c07225 100644 --- a/tools/lib/gzipTileset.js +++ b/tools/lib/gzipTileset.js @@ -1,18 +1,21 @@ 'use strict'; var Cesium = require('cesium'); -var fsExtra = require('fs-extra'); -var path = require('path'); var Promise = require('bluebird'); +var fs = require('fs-extra'); +var path = require('path'); var zlib = require('zlib'); -var getDefaultWriteCallback = require('./getDefaultWriteCallback'); -var isGzipped = require('./isGzipped'); -var fsExtraReadFile = Promise.promisify(fsExtra.readFile); +var getDefaultWriteCallback = require('./getDefaultWriteCallback'); +var getFilesInDirectory = require('./getFilesInDirectory'); +var isTileFile = require('./isTileFile'); +var readTile = require('./readTile'); var defaultValue = Cesium.defaultValue; var defined = Cesium.defined; var DeveloperError = Cesium.DeveloperError; +var zlibGzip = Promise.promisify(zlib.gzip); + module.exports = gzipTileset; /** @@ -40,100 +43,26 @@ function gzipTileset(options) { outputDirectory = path.normalize(defaultValue(outputDirectory, path.join(path.dirname(inputDirectory), path.basename(inputDirectory) + '-' + (gzip ? 'gzipped' : 'ungzipped')))); - var writeCallback = defaultValue(options.writeCallback, getDefaultWriteCallback(outputDirectory)); + var writeCallback = defaultValue(options.writeCallback, getDefaultWriteCallback()); var logCallback = options.logCallback; if (defined(logCallback)) { logCallback((gzip ? 'Compressing' : 'Uncompressing') + ' files...'); } - var operation = gzip ? zlib.gzipSync : zlib.gunzipSync; - - return new Promise(function(resolve, reject) { - getNumberOfFilesInDirectory(inputDirectory) - .then(function(numberOfFiles) { - var writeFile = getWriteFile(writeCallback, numberOfFiles, resolve, reject); - fsExtra.walk(inputDirectory) - .on('data', function (item) { - if (!item.stats.isDirectory()) { - var inputFile = item.path; - var file = path.relative(inputDirectory, item.path); - - if (gzip && tilesOnly && !isTile(inputFile)) { - copyFile(inputFile, file, writeFile); - } else { - isGzipped(inputFile) - .then(function(fileIsGzipped) { - if (fileIsGzipped === gzip) { - // File is already in the correct state - copyFile(inputFile, file, writeFile); - } else { - fsExtraReadFile(inputFile) - .then(function(data) { - data = operation(data); - writeFile(file, data); - }) - .catch(reject); - } - }) - .catch(reject); - } - } - }) - .on('error', reject); - }) - .catch(reject); - }); -} - -function isTile(file) { - var extension = path.extname(file); - return extension === '.b3dm' || - extension === '.i3dm' || - extension === '.pnts' || - extension === '.cmpt' || - extension === '.vctr'; -} - -function getNumberOfFilesInDirectory(directory) { - return new Promise(function(resolve, reject) { - var numberOfFiles = 0; - fsExtra.walk(directory) - .on('data', function (item) { - if (!item.stats.isDirectory()) { - ++numberOfFiles; + return getFilesInDirectory(inputDirectory, { + recursive: true + }).map(function (filename) { + var writeFile = path.join(outputDirectory, path.relative(inputDirectory, filename)); + return readTile(filename) + .then(function(data) { + if (gzip && (!tilesOnly || isTileFile(writeFile))) { + return zlibGzip(data); } + return Promise.resolve(data); }) - .on('end', function () { - resolve(numberOfFiles); - }) - .on('error', reject); + .then(function(data) { + return writeCallback(writeFile, data); + }); }); } - -function getWriteFile(writeCallback, numberOfFiles, resolve, reject) { - var numberComplete = 0; - function complete() { - ++numberComplete; - if (numberComplete === numberOfFiles) { - resolve(); - } - } - return function(file, data) { - var promise = writeCallback(file, data); - if (defined(promise)) { - promise - .then(complete) - .catch(reject); - } else { - complete(); - } - }; -} - -function copyFile(inputFile, file, writeFile) { - return fsExtraReadFile(inputFile) - .then(function(data) { - return writeFile(file, data); - }); -} diff --git a/tools/lib/isGzipped.js b/tools/lib/isGzipped.js index 9313a6f3..ac094843 100644 --- a/tools/lib/isGzipped.js +++ b/tools/lib/isGzipped.js @@ -1,17 +1,20 @@ 'use strict'; -var fsExtra = require('fs-extra'); -var Promise = require('bluebird'); +var Cesium = require('cesium'); -var fsExtraReadFile = Promise.promisify(fsExtra.readFile); +var DeveloperError = Cesium.DeveloperError; +var defined = Cesium.defined; module.exports = isGzipped; /** - * @private + * Test if the provided data is gzipped. + * + * @param {Buffer} data A buffer containing the data to test. + * @returns {Boolean} True if the data is gzipped, False if not. */ -function isGzipped(file) { - return fsExtraReadFile(file) - .then(function (data) { - return (data[0] === 0x1f) && (data[1] === 0x8b); - }); -} +function isGzipped(data) { + if (!defined(data)) { + throw new DeveloperError('data must be defined.'); + } + return data[0] === 0x1f && data[1] === 0x8b; +} \ No newline at end of file diff --git a/tools/lib/isGzippedFile.js b/tools/lib/isGzippedFile.js new file mode 100644 index 00000000..c97193bb --- /dev/null +++ b/tools/lib/isGzippedFile.js @@ -0,0 +1,19 @@ +'use strict'; +var Promise = require('bluebird'); +var fsExtra = require('fs-extra'); + +var isGzipped = require('./isGzipped'); + +var fsExtraReadFile = Promise.promisify(fsExtra.readFile); + +module.exports = isGzippedFile; + +/** + * @private + */ +function isGzippedFile(file) { + return fsExtraReadFile(file) + .then(function (data) { + return isGzipped(data); + }); +} diff --git a/tools/lib/isTileFile.js b/tools/lib/isTileFile.js new file mode 100644 index 00000000..0d56b3ff --- /dev/null +++ b/tools/lib/isTileFile.js @@ -0,0 +1,13 @@ +'use strict'; +var path = require('path'); + +module.exports = isTileFile; + +function isTileFile(file) { + var extension = path.extname(file); + return extension === '.b3dm' || + extension === '.i3dm' || + extension === '.pnts' || + extension === '.cmpt' || + extension === '.vctr'; +} \ No newline at end of file diff --git a/tools/lib/makeCompositeTile.js b/tools/lib/makeCompositeTile.js new file mode 100644 index 00000000..b9a1c5e0 --- /dev/null +++ b/tools/lib/makeCompositeTile.js @@ -0,0 +1,32 @@ +'use strict'; + +module.exports = makeCompositeTile; + +/** + * Combines an array of tile buffers into a single composite tile. + * + * @param {Array.} tileBuffers An array of buffers holding tile data. + * @returns {Buffer} A single buffer holding the composite tile. + */ +function makeCompositeTile(tileBuffers) { + var header = new Buffer(16); + var buffers = []; + buffers.push(header); + var byteLength = header.length; + for (var i = 0; i < tileBuffers.length; i++) { + var tile = tileBuffers[i]; + // Byte align all tiles to 4 bytes + var tilePadding = tile.length % 4; + if (tilePadding !== 0) { + tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); + } + tile.writeUInt32LE(tile.length, 8); // byteLength + byteLength += tile.length; + buffers.push(tile); + } + header.write('cmpt', 0); // magic + header.writeUInt32LE(1, 4); // version + header.writeUInt32LE(byteLength, 8); // byteLength + header.writeUInt32LE(tileBuffers.length, 12); // tilesLength + return Buffer.concat(buffers); +} \ No newline at end of file diff --git a/tools/lib/readTile.js b/tools/lib/readTile.js new file mode 100644 index 00000000..82d3ec52 --- /dev/null +++ b/tools/lib/readTile.js @@ -0,0 +1,38 @@ +'use strict'; +var Cesium = require('cesium'); +var Promise = require('bluebird'); +var fs = require('fs-extra'); +var zlib = require('zlib'); +var isGzipped = require('./isGzipped'); + +var DeveloperError = Cesium.DeveloperError; +var defined = Cesium.defined; + +var fsReadFile = Promise.promisify(fs.readFile); +var zlibGunzip = Promise.promisify(zlib.gunzip); + +module.exports = readTile; + +/** + * Reads tile data from a file. + * + * @param {String} filePath The file path to read from. + * @returns {Promise} A promise that resolves with the data when the read operation completes. + * + * @throws {DeveloperError} Will throw an error if filePath is undefined. + */ +function readTile(filePath) { + return Promise.resolve() + .then(function() { + if (!defined(filePath)) { + throw new DeveloperError('filePath must be defined'); + } + return fsReadFile(filePath); + }) + .then(function(buffer) { + if (isGzipped(buffer)) { + return zlibGunzip(buffer, undefined); + } + return buffer; + }); +} \ No newline at end of file diff --git a/tools/lib/runPipeline.js b/tools/lib/runPipeline.js index cc771f0d..84235e39 100644 --- a/tools/lib/runPipeline.js +++ b/tools/lib/runPipeline.js @@ -1,8 +1,9 @@ 'use strict'; var Cesium = require('cesium'); -var fsExtra = require('fs-extra'); -var path = require('path'); var Promise = require('bluebird'); +var fs = require('fs-extra'); +var path = require('path'); + var getWorkingDirectory = require('./getWorkingDirectory'); var gzipTileset = require('./gzipTileset'); @@ -10,9 +11,9 @@ var defaultValue = Cesium.defaultValue; var defined = Cesium.defined; var DeveloperError = Cesium.DeveloperError; -var fsExtraCopy = Promise.promisify(fsExtra.copy); -var fsExtraEmptyDir = Promise.promisify(fsExtra.emptyDir); -var fsExtraRemove = Promise.promisify(fsExtra.remove); +var fsCopy = Promise.promisify(fs.copy); +var fsEmptyDir = Promise.promisify(fs.emptyDir); +var fsRemove = Promise.promisify(fs.remove); module.exports = runPipeline; @@ -41,7 +42,7 @@ function runPipeline(pipeline, options) { path.join(path.dirname(inputDirectory), path.basename(inputDirectory) + '-processed'))); if (!defined(stages)) { - return fsExtraCopy(inputDirectory, outputDirectory); + return fsCopy(inputDirectory, outputDirectory); } options = defaultValue(options, defaultValue.EMPTY_OBJECT); @@ -90,25 +91,25 @@ function runPipeline(pipeline, options) { } stageObjects.push({ - options : stageOptions, - stageFunction : stageFunction, - name : stageName + options: stageOptions, + stageFunction: stageFunction, + name: stageName }); } // Run the stages in sequence - return Promise.each(stageObjects, function(stage) { - return fsExtraEmptyDir(stage.options.outputDirectory) - .then(function() { + return Promise.each(stageObjects, function (stage) { + return fsEmptyDir(stage.options.outputDirectory) + .then(function () { if (defined(logCallback)) { logCallback('Running ' + stage.name); } return stage.stageFunction(stage.options); }); - }).finally(function() { + }).finally(function () { return Promise.all([ - fsExtraRemove(workingDirectory1), - fsExtraRemove(workingDirectory2) + fsRemove(workingDirectory1), + fsRemove(workingDirectory2) ]); }); } diff --git a/tools/lib/writeTile.js b/tools/lib/writeTile.js new file mode 100644 index 00000000..ed581871 --- /dev/null +++ b/tools/lib/writeTile.js @@ -0,0 +1,44 @@ +'use strict'; +var Cesium = require('cesium'); +var Promise = require('bluebird'); +var fs = require('fs-extra'); +var zlib = require('zlib'); + +var DeveloperError = Cesium.DeveloperError; +var defaultValue = Cesium.defaultValue; +var defined = Cesium.defined; + +var fsOutputFile = Promise.promisify(fs.outputFile); +var zlibGzip = Promise.promisify(zlib.gzip); + +module.exports = writeTile; + +/** + * Writes the tile data to a file. + * + * @param {String} filePath The file path where the tile should be written. + * @param {Buffer} tileData A buffer containing the tile data to write. + * @param {Object} [options] Defines custom behavior for writing. + * @param {Boolean} [options.gzip=false] Flag to gzip the buffer data before writing. + * @returns {Promise} A promise that resolves when the write operation completes. + */ +function writeTile(filePath, tileData, options) { + return Promise.resolve() + .then(function() { + if (!defined(filePath)) { + throw new DeveloperError('filePath must be defined.'); + } + if (!defined(tileData)) { + throw new DeveloperError('tileData must be defined.'); + } + options = defaultValue(options, {}); + var gzip = defaultValue(options.gzip, false); + if (gzip) { + return zlibGzip(tileData, undefined); + } + return Promise.resolve(tileData); + }) + .then(function(buffer) { + return fsOutputFile(filePath, buffer); + }); +} \ No newline at end of file diff --git a/tools/specs/lib/getFilesInDirectorySpec.js b/tools/specs/lib/getFilesInDirectorySpec.js new file mode 100644 index 00000000..3be1d310 --- /dev/null +++ b/tools/specs/lib/getFilesInDirectorySpec.js @@ -0,0 +1,74 @@ +'use strict'; +var Promise = require('bluebird'); +var fs = require('fs-extra'); +var path = require('path'); + +var isTileFile = require('../../lib/isTileFile'); +var getFilesInDirectory = require('../../lib/getFilesInDirectory'); + +var fsOutputFile = Promise.promisify(fs.outputFile); +var fsRemove = Promise.promisify(fs.remove); + +describe('getFilesInDirectory', function() { + beforeAll(function(done) { + Promise.all([ + fsOutputFile('tmp/0.b3dm', ''), + fsOutputFile('tmp/1.i3dm', ''), + fsOutputFile('tmp/0/2.cmpt', ''), + fsOutputFile('tmp/0/0/3.vctr', ''), + fsOutputFile('tmp/1/4.pnts', ''), + fsOutputFile('tmp/1/5.not-a-tile', '') + ]) + .then(done) + }); + + afterAll(function(done) { + fsRemove('tmp') + .then(done); + }); + + it('gets files in a directory', function(done) { + expect(getFilesInDirectory('tmp') + .then(function(files) { + files.sort(); + expect(files).toEqual([ + path.normalize('tmp/0.b3dm'), + path.normalize('tmp/1.i3dm') + ]); + }), done).toResolve(); + }); + + it('gets files in a directory recursively', function(done) { + expect(getFilesInDirectory('tmp', { + recursive : true + }) + .then(function(files) { + files.sort(); + expect(files).toEqual([ + path.normalize('tmp/0.b3dm'), + path.normalize('tmp/0/0/3.vctr'), + path.normalize('tmp/0/2.cmpt'), + path.normalize('tmp/1.i3dm'), + path.normalize('tmp/1/4.pnts'), + path.normalize('tmp/1/5.not-a-tile') + ]); + }), done).toResolve(); + }); + + it('gets files in a directory with a filter', function(done) { + expect(getFilesInDirectory('tmp', { + recursive : true, + filter : isTileFile + }) + .then(function(files) { + files.sort(); + expect(files).toEqual([ + path.normalize('tmp/0.b3dm'), + path.normalize('tmp/0/0/3.vctr'), + path.normalize('tmp/0/2.cmpt'), + path.normalize('tmp/1.i3dm'), + path.normalize('tmp/1/4.pnts') + ]); + }), done).toResolve(); + }) +}); \ No newline at end of file diff --git a/tools/specs/lib/gzipTilesetSpec.js b/tools/specs/lib/gzipTilesetSpec.js index 5708e12d..f1b03dc4 100644 --- a/tools/specs/lib/gzipTilesetSpec.js +++ b/tools/specs/lib/gzipTilesetSpec.js @@ -1,13 +1,13 @@ 'use strict'; -var fsExtra = require('fs-extra'); +var fs = require('fs-extra'); var path = require('path'); var Promise = require('bluebird'); -var isGzipped = require('../../lib/isGzipped'); +var isGzippedFile = require('../../lib/isGzippedFile'); var gzipTileset = require('../../lib/gzipTileset'); -var fsExtraOutputFile = Promise.promisify(fsExtra.outputFile); -var fsExtraReadFile = Promise.promisify(fsExtra.readFile); -var fsExtraRemove = Promise.promisify(fsExtra.remove); +var fsOutputFile = Promise.promisify(fs.outputFile); +var fsReadFile = Promise.promisify(fs.readFile); +var fsRemove = Promise.promisify(fs.remove); var tilesetDirectory = './specs/data/TilesetOfTilesets/'; var tilesetJson = './specs/data/TilesetOfTilesets/tileset.json'; @@ -19,8 +19,8 @@ var ungzippedJson = './specs/data/TilesetOfTilesets-ungzipped/tileset.json'; describe('gzipTileset', function() { afterEach(function (done) { Promise.all([ - fsExtraRemove(gzippedDirectory), - fsExtraRemove(ungzippedDirectory) + fsRemove(gzippedDirectory), + fsRemove(ungzippedDirectory) ]).then(function() { done(); }); @@ -34,9 +34,9 @@ describe('gzipTileset', function() { }; expect(gzipTileset(gzipOptions) .then(function() { - return isGzipped(gzippedJson) - .then(function(isGzipped) { - expect(isGzipped).toBe(true); + return isGzippedFile(gzippedJson) + .then(function(gzipped) { + expect(gzipped).toBe(true); }); }), done).toResolve(); }); @@ -56,9 +56,9 @@ describe('gzipTileset', function() { .then(function() { return gzipTileset(ungzipOptions) .then(function() { - return isGzipped(ungzippedJson) - .then(function(isGzipped) { - expect(isGzipped).toBe(false); + return isGzippedFile(ungzippedJson) + .then(function(gzipped) { + expect(gzipped).toBe(false); }); }); }), done).toResolve(); @@ -71,9 +71,9 @@ describe('gzipTileset', function() { }; expect(gzipTileset(gzipOptions) .then(function() { - return isGzipped(gzippedJson) - .then(function(isGzipped) { - expect(isGzipped).toBe(true); + return isGzippedFile(gzippedJson) + .then(function(gzipped) { + expect(gzipped).toBe(true); }); }), done).toResolve(); }); @@ -94,8 +94,8 @@ describe('gzipTileset', function() { return gzipTileset(gzipAgainOptions) .then(function() { var promises = [ - fsExtraReadFile(gzippedJson), - fsExtraReadFile(ungzippedJson) + fsReadFile(gzippedJson), + fsReadFile(ungzippedJson) ]; return Promise.all(promises) .then(function(contents) { @@ -114,8 +114,8 @@ describe('gzipTileset', function() { expect(gzipTileset(ungzipOptions) .then(function() { var promises = [ - fsExtraReadFile(tilesetJson), - fsExtraReadFile(ungzippedJson) + fsReadFile(tilesetJson), + fsReadFile(ungzippedJson) ]; return Promise.all(promises) .then(function(contents) { @@ -133,9 +133,9 @@ describe('gzipTileset', function() { }; expect(gzipTileset(gzipOptions) .then(function() { - return isGzipped(gzippedJson) - .then(function(isGzipped) { - expect(isGzipped).toBe(false); + return isGzippedFile(gzippedJson) + .then(function(gzipped) { + expect(gzipped).toBe(false); }); }), done).toResolve(); }); @@ -173,21 +173,20 @@ describe('gzipTileset', function() { }); it('accepts custom writeCallback that returns a promise', function (done) { - var outputDirectory = gzippedDirectory; var writeCallback = function(file, data) { - var outputFile = path.join(outputDirectory, file); - return fsExtraOutputFile(outputFile, data); + return fsOutputFile(file, data); }; var gzipOptions = { inputDirectory : tilesetDirectory, + outputDirectory : gzippedDirectory, gzip : true, writeCallback : writeCallback }; expect(gzipTileset(gzipOptions) .then(function() { - return isGzipped(gzippedJson) - .then(function(isGzipped) { - expect(isGzipped).toBe(true); + return isGzippedFile(gzippedJson) + .then(function(gzipped) { + expect(gzipped).toBe(true); }); }), done).toResolve(); }); diff --git a/tools/specs/lib/isGzippedSpec.js b/tools/specs/lib/isGzippedSpec.js new file mode 100644 index 00000000..7ee86850 --- /dev/null +++ b/tools/specs/lib/isGzippedSpec.js @@ -0,0 +1,23 @@ +'use strict'; +var Promise = require('bluebird'); +var zlib = require('zlib'); +var isGzipped = require('../../lib/isGzipped'); + +var zlibGzip = Promise.promisify(zlib.gzip); + +describe('isGzipped', function() { + it('throws DeveloperError if data is undefined', function() { + expect(function() { + isGzipped(undefined); + }).toThrowError(); + }); + + it('detects when data is gzipped', function(done) { + var data = new Buffer(40); + expect(isGzipped(data)).toBeFalsy(); + expect(zlibGzip(data, undefined) + .then(function(zippedData) { + expect(isGzipped(zippedData)).toBeTruthy(); + }), done).toResolve(); + }); +}); \ No newline at end of file diff --git a/tools/specs/lib/makeCompositeTileSpec.js b/tools/specs/lib/makeCompositeTileSpec.js new file mode 100644 index 00000000..4c2ad732 --- /dev/null +++ b/tools/specs/lib/makeCompositeTileSpec.js @@ -0,0 +1,28 @@ +'use strict'; +var makeCompositeTile = require('../../lib/makeCompositeTile'); +var readTile = require('../../lib/readTile'); + +var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; + +describe('makeCompositeTile', function() { + it('makes a composite tile', function(done) { + expect(readTile(justHeaderI3dmPath) + .then(function(tile) { + var tiles = [tile, tile]; + return makeCompositeTile(tiles); + }) + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + var byteLength = 16 + 32 + 32; + expect(tileData.length).toBe(byteLength); + expect(magic).toEqual('cmpt'); // magic + expect(tileData.readUInt32LE(4)).toBe(1); // version + expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength + expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength + var tileMagic = tileData.toString('utf8', 16, 20); + expect(tileMagic).toEqual('i3dm'); + tileMagic = tileData.toString('utf8', 48, 52); + expect(tileMagic).toEqual('i3dm'); + }), done).toResolve(); + }); +}); \ No newline at end of file diff --git a/tools/specs/lib/readTileSpec.js b/tools/specs/lib/readTileSpec.js new file mode 100644 index 00000000..fbc442a9 --- /dev/null +++ b/tools/specs/lib/readTileSpec.js @@ -0,0 +1,27 @@ +'use strict'; +var readTile = require('../../lib/readTile'); + +describe('readTile', function() { + it('throws DeveloperError if filePath is undefined', function(done) { + expect(readTile(undefined) + .catch(function(error) { + expect(error).toBeDefined(); + }), done).toResolve(); + }); + + it('reads a tile', function(done) { + expect(readTile('./specs/data/justHeader.i3dm') + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + expect(magic).toEqual('i3dm'); + }), done).toResolve(); + }); + + it('reads a gzipped tile', function(done) { + expect(readTile('./specs/data/justHeaderGzipped.i3dm') + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + expect(magic).toEqual('i3dm'); + }), done).toResolve(); + }); +}); \ No newline at end of file diff --git a/tools/specs/lib/runPipelineSpec.js b/tools/specs/lib/runPipelineSpec.js index 140534b4..98815237 100644 --- a/tools/specs/lib/runPipelineSpec.js +++ b/tools/specs/lib/runPipelineSpec.js @@ -2,7 +2,7 @@ var fsExtra = require('fs-extra'); var path = require('path'); var Promise = require('bluebird'); -var isGzipped = require('../../lib/isGzipped'); +var isGzipped = require('../../lib/isGzippedFile'); var runPipeline = require('../../lib/runPipeline'); var fsExtraOutputFile = Promise.promisify(fsExtra.outputFile); @@ -177,12 +177,12 @@ describe('runPipeline', function() { it('accepts custom writeCallback', function (done) { var writeCallback = function(file, data) { - var outputFile = path.join(outputDirectory, file); - return fsExtraOutputFile(outputFile, data); + return fsExtraOutputFile(file, data); }; var pipeline = { input : inputDirectory, + output : outputDirectory, stages : ['gzip'] }; diff --git a/tools/specs/lib/writeTileSpec.js b/tools/specs/lib/writeTileSpec.js new file mode 100644 index 00000000..f77804c2 --- /dev/null +++ b/tools/specs/lib/writeTileSpec.js @@ -0,0 +1,57 @@ +'use strict'; +var Promise = require('bluebird'); +var fs = require('fs-extra'); +var rimraf = require('rimraf'); +var isGzipped = require('../../lib/isGzipped'); +var writeTile = require('../../lib/writeTile'); + +var fsReadFile = Promise.promisify(fs.readFile); +var rimrafAsync = Promise.promisify(rimraf); + +var testOutputPath = './specs/data/.test/'; + +describe('writeTile', function() { + afterAll(function(done) { + rimrafAsync(testOutputPath, {}) + .then(done); + }); + + it('throws DeveloperError if filePath is undefined', function(done) { + expect(writeTile(undefined, new Buffer(0)) + .catch(function(error) { + expect(error).toBeDefined(); + }), done).toResolve(); + }); + + it('throws DeveloperError if tileData is undefined', function(done) { + expect(writeTile('', undefined) + .catch(function(error) { + expect(error).toBeDefined(); + }), done).toResolve(); + }); + + it('writes a tile', function(done) { + var path = testOutputPath + 'justmagic.i3dm'; + var data = new Buffer('i3dm'); + expect(writeTile(path, data) + .then(function() { + return fsReadFile(path); + }) + .then(function(tileData) { + var magic = tileData.toString('utf8', 0, 4); + expect(magic).toEqual('i3dm'); + }),done).toResolve(); + }); + + it('writes a gzipped tile', function(done) { + var path = testOutputPath + 'justmagic.i3dm'; + var data = new Buffer('i3dm'); + expect(writeTile(path, data, {gzip : true}) + .then(function() { + return fsReadFile(path); + }) + .then(function(tileData) { + expect(isGzipped(tileData)).toBeTruthy(); + }),done).toResolve(); + }); +}); \ No newline at end of file From 6e0f9c72a26262849623c45fd87a00f72f699864 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:21:14 -0400 Subject: [PATCH 11/20] Removed files from generator --- generator/bin/makeCompositeTile.js | 37 --------- generator/lib/isGzipped.js | 22 ------ generator/lib/makeCompositeTile.js | 32 -------- generator/lib/readTile.js | 38 --------- generator/lib/writeTile.js | 47 ----------- generator/specs/bin/makeCompositeTileSpec.js | 83 -------------------- generator/specs/lib/isGzippedSpec.js | 23 ------ generator/specs/lib/makeCompositeTileSpec.js | 28 ------- generator/specs/lib/readTileSpec.js | 27 ------- generator/specs/lib/writeTileSpec.js | 57 -------------- 10 files changed, 394 deletions(-) delete mode 100644 generator/bin/makeCompositeTile.js delete mode 100644 generator/lib/isGzipped.js delete mode 100644 generator/lib/makeCompositeTile.js delete mode 100644 generator/lib/readTile.js delete mode 100644 generator/lib/writeTile.js delete mode 100644 generator/specs/bin/makeCompositeTileSpec.js delete mode 100644 generator/specs/lib/isGzippedSpec.js delete mode 100644 generator/specs/lib/makeCompositeTileSpec.js delete mode 100644 generator/specs/lib/readTileSpec.js delete mode 100644 generator/specs/lib/writeTileSpec.js diff --git a/generator/bin/makeCompositeTile.js b/generator/bin/makeCompositeTile.js deleted file mode 100644 index 862e1df8..00000000 --- a/generator/bin/makeCompositeTile.js +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env node -'use strict'; -var Promise = require('bluebird'); -var makeCompositeTile = require('../lib/makeCompositeTile'); -var readTile = require('../lib/readTile'); -var writeTile = require('../lib/writeTile'); - -var argv = require('yargs') - .usage('Usage: $0 \ [options]') - .example('$0 batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt') - .example('$0 *.b3dm -o output/composite.cmpt') - .alias('o', 'output') - .default('o', 'output/composite.cmpt') - .nargs('o', 1) - .describe('o', 'Output path where the composite tile should be written.') - .boolean('z') - .alias('z', 'gzip') - .default('z', false) - .describe('z', 'Flag to gzip the output composite tile.') - .help('h') - .alias('h', 'help') - .demand(1) - .argv; - -var tilePaths = argv._; -var outputPath = argv.o; - -Promise.map(tilePaths, function(tilePath) { - return readTile(tilePath); -}) - .then(function(tiles) { - var options = {}; - if (argv.z) { - options.gzip = true; - } - return writeTile(outputPath, makeCompositeTile(tiles), options); - }); diff --git a/generator/lib/isGzipped.js b/generator/lib/isGzipped.js deleted file mode 100644 index bd61ed27..00000000 --- a/generator/lib/isGzipped.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; -var Cesium = require('cesium'); - -var DeveloperError = Cesium.DeveloperError; -var defined = Cesium.defined; - -module.exports = isGzipped; - -/** - * Test if the provided data is gzipped. - * - * @param {Buffer} data A buffer containing the data to test. - * @returns {Boolean} True if the data is gzipped, False if not. - * - * @throws {DeveloperError} Will throw an error if data is undefined. - */ -function isGzipped(data) { - if (!defined(data)) { - throw new DeveloperError('data must be defined.'); - } - return data[0] === 0x1f && data[1] === 0x8b; -} \ No newline at end of file diff --git a/generator/lib/makeCompositeTile.js b/generator/lib/makeCompositeTile.js deleted file mode 100644 index b9a1c5e0..00000000 --- a/generator/lib/makeCompositeTile.js +++ /dev/null @@ -1,32 +0,0 @@ -'use strict'; - -module.exports = makeCompositeTile; - -/** - * Combines an array of tile buffers into a single composite tile. - * - * @param {Array.} tileBuffers An array of buffers holding tile data. - * @returns {Buffer} A single buffer holding the composite tile. - */ -function makeCompositeTile(tileBuffers) { - var header = new Buffer(16); - var buffers = []; - buffers.push(header); - var byteLength = header.length; - for (var i = 0; i < tileBuffers.length; i++) { - var tile = tileBuffers[i]; - // Byte align all tiles to 4 bytes - var tilePadding = tile.length % 4; - if (tilePadding !== 0) { - tile = Buffer.concat([tile, new Buffer(4 - tilePadding)]); - } - tile.writeUInt32LE(tile.length, 8); // byteLength - byteLength += tile.length; - buffers.push(tile); - } - header.write('cmpt', 0); // magic - header.writeUInt32LE(1, 4); // version - header.writeUInt32LE(byteLength, 8); // byteLength - header.writeUInt32LE(tileBuffers.length, 12); // tilesLength - return Buffer.concat(buffers); -} \ No newline at end of file diff --git a/generator/lib/readTile.js b/generator/lib/readTile.js deleted file mode 100644 index 82d3ec52..00000000 --- a/generator/lib/readTile.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; -var Cesium = require('cesium'); -var Promise = require('bluebird'); -var fs = require('fs-extra'); -var zlib = require('zlib'); -var isGzipped = require('./isGzipped'); - -var DeveloperError = Cesium.DeveloperError; -var defined = Cesium.defined; - -var fsReadFile = Promise.promisify(fs.readFile); -var zlibGunzip = Promise.promisify(zlib.gunzip); - -module.exports = readTile; - -/** - * Reads tile data from a file. - * - * @param {String} filePath The file path to read from. - * @returns {Promise} A promise that resolves with the data when the read operation completes. - * - * @throws {DeveloperError} Will throw an error if filePath is undefined. - */ -function readTile(filePath) { - return Promise.resolve() - .then(function() { - if (!defined(filePath)) { - throw new DeveloperError('filePath must be defined'); - } - return fsReadFile(filePath); - }) - .then(function(buffer) { - if (isGzipped(buffer)) { - return zlibGunzip(buffer, undefined); - } - return buffer; - }); -} \ No newline at end of file diff --git a/generator/lib/writeTile.js b/generator/lib/writeTile.js deleted file mode 100644 index ec94e7f7..00000000 --- a/generator/lib/writeTile.js +++ /dev/null @@ -1,47 +0,0 @@ -'use strict'; -var Cesium = require('cesium'); -var Promise = require('bluebird'); -var fs = require('fs-extra'); -var zlib = require('zlib'); - -var DeveloperError = Cesium.DeveloperError; -var defaultValue = Cesium.defaultValue; -var defined = Cesium.defined; - -var fsOutputFile = Promise.promisify(fs.outputFile); -var zlibGzip = Promise.promisify(zlib.gzip); - -module.exports = writeTile; - -/** - * Writes the tile data to a file. - * - * @param {String} filePath The file path where the tile should be written. - * @param {Buffer} tileData A buffer containing the tile data to write. - * @param {Object} [options] Defines custom behavior for writing. - * @param {Boolean} [options.gzip=false] Flag to gzip the buffer data before writing. - * @returns {Promise} A promise that resolves when the write operation completes. - * - * @throws {DeveloperError} Throws an error if filePath is undefined. - * @throws {DeveloperError} Throws an error if tileData is undefined. - */ -function writeTile(filePath, tileData, options) { - return Promise.resolve() - .then(function() { - if (!defined(filePath)) { - throw new DeveloperError('filePath must be defined.'); - } - if (!defined(tileData)) { - throw new DeveloperError('tileData must be defined.'); - } - options = defaultValue(options, {}); - var gzip = defaultValue(options.gzip, false); - if (gzip) { - return zlibGzip(tileData, undefined); - } - return Promise.resolve(tileData); - }) - .then(function(buffer) { - return fsOutputFile(filePath, buffer); - }); -} \ No newline at end of file diff --git a/generator/specs/bin/makeCompositeTileSpec.js b/generator/specs/bin/makeCompositeTileSpec.js deleted file mode 100644 index d4792ae8..00000000 --- a/generator/specs/bin/makeCompositeTileSpec.js +++ /dev/null @@ -1,83 +0,0 @@ -'use strict'; -var Promise = require('bluebird'); -var childProcess = require('child_process'); -var fs = require('fs-extra'); -var rimraf = require('rimraf'); -var isGzipped = require('../../lib/isGzipped'); - -var fsReadFile = Promise.promisify(fs.readFile); -var rimrafAsync = Promise.promisify(rimraf); - -var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; -var justHeaderGzippedI3dmPath = './specs/data/justHeaderGzipped.i3dm'; -var testOutputPath = './specs/data/.test/'; - -describe('makeCompositeTile cli', function() { - afterAll(function(done) { - rimrafAsync(testOutputPath, {}) - .then(done); - }); - - it('makes a composite tile', function(done) { - var outputPath = testOutputPath + 'composite.cmpt'; - expect(makeCompositeTile([justHeaderI3dmPath, justHeaderI3dmPath, '-o', outputPath]) - .then(function() { - return fsReadFile(outputPath); - }) - .then(function(tileData) { - var magic = tileData.toString('utf8', 0, 4); - var byteLength = 16 + 32 + 32; - expect(tileData.length).toBe(byteLength); - expect(magic).toEqual('cmpt'); // magic - expect(tileData.readUInt32LE(4)).toBe(1); // version - expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength - expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength - var tileMagic = tileData.toString('utf8', 16, 20); - expect(tileMagic).toEqual('i3dm'); - tileMagic = tileData.toString('utf8', 48, 52); - expect(tileMagic).toEqual('i3dm'); - }), done).toResolve(); - }); - - it('makes a composite tile from gzipped tiles', function(done) { - var outputPath = testOutputPath + 'compositeFromGzipped.cmpt'; - expect(makeCompositeTile([justHeaderGzippedI3dmPath, justHeaderGzippedI3dmPath, '-o', outputPath]) - .then(function() { - return fsReadFile(outputPath); - }) - .then(function(tileData) { - var magic = tileData.toString('utf8', 0, 4); - var byteLength = 16 + 32 + 32; - expect(tileData.length).toBe(byteLength); - expect(magic).toEqual('cmpt'); // magic - expect(tileData.readUInt32LE(4)).toBe(1); // version - expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength - expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength - var tileMagic = tileData.toString('utf8', 16, 20); - expect(tileMagic).toEqual('i3dm'); - }), done).toResolve(); - }); - - it('makes a gzipped composite tile', function(done) { - var outputPath = testOutputPath + 'compositeGzipped.cmpt'; - expect(makeCompositeTile([justHeaderI3dmPath, justHeaderI3dmPath, '-o', outputPath, '-z']) - .then(function() { - return fsReadFile(outputPath); - }) - .then(function(tileData) { - expect(isGzipped(tileData)).toBeTruthy(); - }), done).toResolve(); - }); -}); - -function makeCompositeTile(args) { - var makeCompositeTileProcess = childProcess.fork('./bin/makeCompositeTile', args); - return new Promise(function(resolve, reject) { - makeCompositeTileProcess.on('close', function() { - resolve(); - }); - makeCompositeTileProcess.on('error', function() { - reject(); - }); - }); -} \ No newline at end of file diff --git a/generator/specs/lib/isGzippedSpec.js b/generator/specs/lib/isGzippedSpec.js deleted file mode 100644 index 7ee86850..00000000 --- a/generator/specs/lib/isGzippedSpec.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; -var Promise = require('bluebird'); -var zlib = require('zlib'); -var isGzipped = require('../../lib/isGzipped'); - -var zlibGzip = Promise.promisify(zlib.gzip); - -describe('isGzipped', function() { - it('throws DeveloperError if data is undefined', function() { - expect(function() { - isGzipped(undefined); - }).toThrowError(); - }); - - it('detects when data is gzipped', function(done) { - var data = new Buffer(40); - expect(isGzipped(data)).toBeFalsy(); - expect(zlibGzip(data, undefined) - .then(function(zippedData) { - expect(isGzipped(zippedData)).toBeTruthy(); - }), done).toResolve(); - }); -}); \ No newline at end of file diff --git a/generator/specs/lib/makeCompositeTileSpec.js b/generator/specs/lib/makeCompositeTileSpec.js deleted file mode 100644 index 4c2ad732..00000000 --- a/generator/specs/lib/makeCompositeTileSpec.js +++ /dev/null @@ -1,28 +0,0 @@ -'use strict'; -var makeCompositeTile = require('../../lib/makeCompositeTile'); -var readTile = require('../../lib/readTile'); - -var justHeaderI3dmPath = './specs/data/justHeader.i3dm'; - -describe('makeCompositeTile', function() { - it('makes a composite tile', function(done) { - expect(readTile(justHeaderI3dmPath) - .then(function(tile) { - var tiles = [tile, tile]; - return makeCompositeTile(tiles); - }) - .then(function(tileData) { - var magic = tileData.toString('utf8', 0, 4); - var byteLength = 16 + 32 + 32; - expect(tileData.length).toBe(byteLength); - expect(magic).toEqual('cmpt'); // magic - expect(tileData.readUInt32LE(4)).toBe(1); // version - expect(tileData.readUInt32LE(8)).toBe(byteLength); // byteLength - expect(tileData.readUInt32LE(12)).toBe(2); // tilesLength - var tileMagic = tileData.toString('utf8', 16, 20); - expect(tileMagic).toEqual('i3dm'); - tileMagic = tileData.toString('utf8', 48, 52); - expect(tileMagic).toEqual('i3dm'); - }), done).toResolve(); - }); -}); \ No newline at end of file diff --git a/generator/specs/lib/readTileSpec.js b/generator/specs/lib/readTileSpec.js deleted file mode 100644 index fbc442a9..00000000 --- a/generator/specs/lib/readTileSpec.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; -var readTile = require('../../lib/readTile'); - -describe('readTile', function() { - it('throws DeveloperError if filePath is undefined', function(done) { - expect(readTile(undefined) - .catch(function(error) { - expect(error).toBeDefined(); - }), done).toResolve(); - }); - - it('reads a tile', function(done) { - expect(readTile('./specs/data/justHeader.i3dm') - .then(function(tileData) { - var magic = tileData.toString('utf8', 0, 4); - expect(magic).toEqual('i3dm'); - }), done).toResolve(); - }); - - it('reads a gzipped tile', function(done) { - expect(readTile('./specs/data/justHeaderGzipped.i3dm') - .then(function(tileData) { - var magic = tileData.toString('utf8', 0, 4); - expect(magic).toEqual('i3dm'); - }), done).toResolve(); - }); -}); \ No newline at end of file diff --git a/generator/specs/lib/writeTileSpec.js b/generator/specs/lib/writeTileSpec.js deleted file mode 100644 index f77804c2..00000000 --- a/generator/specs/lib/writeTileSpec.js +++ /dev/null @@ -1,57 +0,0 @@ -'use strict'; -var Promise = require('bluebird'); -var fs = require('fs-extra'); -var rimraf = require('rimraf'); -var isGzipped = require('../../lib/isGzipped'); -var writeTile = require('../../lib/writeTile'); - -var fsReadFile = Promise.promisify(fs.readFile); -var rimrafAsync = Promise.promisify(rimraf); - -var testOutputPath = './specs/data/.test/'; - -describe('writeTile', function() { - afterAll(function(done) { - rimrafAsync(testOutputPath, {}) - .then(done); - }); - - it('throws DeveloperError if filePath is undefined', function(done) { - expect(writeTile(undefined, new Buffer(0)) - .catch(function(error) { - expect(error).toBeDefined(); - }), done).toResolve(); - }); - - it('throws DeveloperError if tileData is undefined', function(done) { - expect(writeTile('', undefined) - .catch(function(error) { - expect(error).toBeDefined(); - }), done).toResolve(); - }); - - it('writes a tile', function(done) { - var path = testOutputPath + 'justmagic.i3dm'; - var data = new Buffer('i3dm'); - expect(writeTile(path, data) - .then(function() { - return fsReadFile(path); - }) - .then(function(tileData) { - var magic = tileData.toString('utf8', 0, 4); - expect(magic).toEqual('i3dm'); - }),done).toResolve(); - }); - - it('writes a gzipped tile', function(done) { - var path = testOutputPath + 'justmagic.i3dm'; - var data = new Buffer('i3dm'); - expect(writeTile(path, data, {gzip : true}) - .then(function() { - return fsReadFile(path); - }) - .then(function(tileData) { - expect(isGzipped(tileData)).toBeTruthy(); - }),done).toResolve(); - }); -}); \ No newline at end of file From 434ed9ab620838e2d0a896ec612d958581e8c403 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:27:24 -0400 Subject: [PATCH 12/20] Fixed a few errors --- tools/lib/getFilesInDirectory.js | 4 ++-- tools/lib/gzipTileset.js | 1 - tools/specs/data/justHeader.i3dm | Bin 0 -> 32 bytes tools/specs/data/justHeaderGzipped.i3dm | Bin 0 -> 50 bytes tools/specs/lib/getFilesInDirectorySpec.js | 4 ++-- tools/specs/lib/gzipTilesetSpec.js | 1 - tools/specs/lib/runPipelineSpec.js | 1 - tools/specs/lib/writeTileSpec.js | 5 ++--- 8 files changed, 6 insertions(+), 10 deletions(-) create mode 100644 tools/specs/data/justHeader.i3dm create mode 100644 tools/specs/data/justHeaderGzipped.i3dm diff --git a/tools/lib/getFilesInDirectory.js b/tools/lib/getFilesInDirectory.js index 98e89492..593b661b 100644 --- a/tools/lib/getFilesInDirectory.js +++ b/tools/lib/getFilesInDirectory.js @@ -15,7 +15,7 @@ function getFilesInDirectory(directory, options) { var files = []; options = defaultValue(options, {}); var recursive = defaultValue(options.recursive, false); - var filter = defaultValue(options.filter, function(path) { + var filter = defaultValue(options.filter, function() { return true; }); return findFiles(directory, files, recursive, filter); @@ -35,5 +35,5 @@ function findFiles(directory, files, recursive, filter) { }) .then(function() { return files; - }) + }); } \ No newline at end of file diff --git a/tools/lib/gzipTileset.js b/tools/lib/gzipTileset.js index d3c07225..7c4ae660 100644 --- a/tools/lib/gzipTileset.js +++ b/tools/lib/gzipTileset.js @@ -1,7 +1,6 @@ 'use strict'; var Cesium = require('cesium'); var Promise = require('bluebird'); -var fs = require('fs-extra'); var path = require('path'); var zlib = require('zlib'); diff --git a/tools/specs/data/justHeader.i3dm b/tools/specs/data/justHeader.i3dm new file mode 100644 index 0000000000000000000000000000000000000000..43627d9ebd52b54798fb8c5137b75416307d4971 GIT binary patch literal 32 Vcmc~aPRV6pU|NuU;k1e0$<%~|1ePRLHlG6=3 Date: Fri, 7 Oct 2016 12:40:16 -0400 Subject: [PATCH 13/20] Throw errors outside of promise --- tools/lib/getFilesInDirectory.js | 6 ++-- tools/lib/gzipTileset.js | 1 - tools/lib/isGzippedFile.js | 1 - tools/lib/makeCompositeTile.js | 3 +- tools/lib/readTile.js | 15 ++++------ tools/lib/runPipeline.js | 1 - tools/lib/writeTile.js | 35 +++++++++++----------- tools/specs/lib/getFilesInDirectorySpec.js | 1 - tools/specs/lib/isGzippedSpec.js | 6 ++-- tools/specs/lib/readTileSpec.js | 9 +++--- tools/specs/lib/writeTileSpec.js | 22 +++++++------- 11 files changed, 43 insertions(+), 57 deletions(-) diff --git a/tools/lib/getFilesInDirectory.js b/tools/lib/getFilesInDirectory.js index 593b661b..0d5d0f31 100644 --- a/tools/lib/getFilesInDirectory.js +++ b/tools/lib/getFilesInDirectory.js @@ -4,16 +4,16 @@ var Promise = require('bluebird'); var fs = require('fs'); var path = require('path'); +var defaultValue = Cesium.defaultValue; + var fsReaddir = Promise.promisify(fs.readdir); var fsStat = Promise.promisify(fs.stat); -var defaultValue = Cesium.defaultValue; - module.exports = getFilesInDirectory; function getFilesInDirectory(directory, options) { var files = []; - options = defaultValue(options, {}); + options = defaultValue(options, defaultValue); var recursive = defaultValue(options.recursive, false); var filter = defaultValue(options.filter, function() { return true; diff --git a/tools/lib/gzipTileset.js b/tools/lib/gzipTileset.js index 7c4ae660..d543f770 100644 --- a/tools/lib/gzipTileset.js +++ b/tools/lib/gzipTileset.js @@ -3,7 +3,6 @@ var Cesium = require('cesium'); var Promise = require('bluebird'); var path = require('path'); var zlib = require('zlib'); - var getDefaultWriteCallback = require('./getDefaultWriteCallback'); var getFilesInDirectory = require('./getFilesInDirectory'); var isTileFile = require('./isTileFile'); diff --git a/tools/lib/isGzippedFile.js b/tools/lib/isGzippedFile.js index c97193bb..f75cc8ff 100644 --- a/tools/lib/isGzippedFile.js +++ b/tools/lib/isGzippedFile.js @@ -1,7 +1,6 @@ 'use strict'; var Promise = require('bluebird'); var fsExtra = require('fs-extra'); - var isGzipped = require('./isGzipped'); var fsExtraReadFile = Promise.promisify(fsExtra.readFile); diff --git a/tools/lib/makeCompositeTile.js b/tools/lib/makeCompositeTile.js index b9a1c5e0..19ea7f88 100644 --- a/tools/lib/makeCompositeTile.js +++ b/tools/lib/makeCompositeTile.js @@ -1,11 +1,10 @@ 'use strict'; - module.exports = makeCompositeTile; /** * Combines an array of tile buffers into a single composite tile. * - * @param {Array.} tileBuffers An array of buffers holding tile data. + * @param {Buffer[]} tileBuffers An array of buffers holding tile data. * @returns {Buffer} A single buffer holding the composite tile. */ function makeCompositeTile(tileBuffers) { diff --git a/tools/lib/readTile.js b/tools/lib/readTile.js index 82d3ec52..f0b5cc44 100644 --- a/tools/lib/readTile.js +++ b/tools/lib/readTile.js @@ -18,20 +18,15 @@ module.exports = readTile; * * @param {String} filePath The file path to read from. * @returns {Promise} A promise that resolves with the data when the read operation completes. - * - * @throws {DeveloperError} Will throw an error if filePath is undefined. */ function readTile(filePath) { - return Promise.resolve() - .then(function() { - if (!defined(filePath)) { - throw new DeveloperError('filePath must be defined'); - } - return fsReadFile(filePath); - }) + if (!defined(filePath)) { + throw new DeveloperError('filePath must be defined'); + } + return fsReadFile(filePath) .then(function(buffer) { if (isGzipped(buffer)) { - return zlibGunzip(buffer, undefined); + return zlibGunzip(buffer); } return buffer; }); diff --git a/tools/lib/runPipeline.js b/tools/lib/runPipeline.js index 84235e39..7f99566a 100644 --- a/tools/lib/runPipeline.js +++ b/tools/lib/runPipeline.js @@ -3,7 +3,6 @@ var Cesium = require('cesium'); var Promise = require('bluebird'); var fs = require('fs-extra'); var path = require('path'); - var getWorkingDirectory = require('./getWorkingDirectory'); var gzipTileset = require('./gzipTileset'); diff --git a/tools/lib/writeTile.js b/tools/lib/writeTile.js index ed581871..2263e35c 100644 --- a/tools/lib/writeTile.js +++ b/tools/lib/writeTile.js @@ -23,22 +23,21 @@ module.exports = writeTile; * @returns {Promise} A promise that resolves when the write operation completes. */ function writeTile(filePath, tileData, options) { - return Promise.resolve() - .then(function() { - if (!defined(filePath)) { - throw new DeveloperError('filePath must be defined.'); - } - if (!defined(tileData)) { - throw new DeveloperError('tileData must be defined.'); - } - options = defaultValue(options, {}); - var gzip = defaultValue(options.gzip, false); - if (gzip) { - return zlibGzip(tileData, undefined); - } - return Promise.resolve(tileData); - }) - .then(function(buffer) { - return fsOutputFile(filePath, buffer); - }); + if (!defined(filePath)) { + throw new DeveloperError('filePath must be defined.'); + } + if (!defined(tileData)) { + throw new DeveloperError('tileData must be defined.'); + } + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + var gzip = defaultValue(options.gzip, false); + var promise; + if (gzip) { + promise = zlibGzip(tileData); + } else { + promise = Promise.resolve(tileData); + } + return promise.then(function(data) { + return fsOutputFile(filePath, data); + }); } \ No newline at end of file diff --git a/tools/specs/lib/getFilesInDirectorySpec.js b/tools/specs/lib/getFilesInDirectorySpec.js index ab01ad10..6fd8a0d2 100644 --- a/tools/specs/lib/getFilesInDirectorySpec.js +++ b/tools/specs/lib/getFilesInDirectorySpec.js @@ -2,7 +2,6 @@ var Promise = require('bluebird'); var fs = require('fs-extra'); var path = require('path'); - var isTileFile = require('../../lib/isTileFile'); var getFilesInDirectory = require('../../lib/getFilesInDirectory'); diff --git a/tools/specs/lib/isGzippedSpec.js b/tools/specs/lib/isGzippedSpec.js index 7ee86850..b5b14a94 100644 --- a/tools/specs/lib/isGzippedSpec.js +++ b/tools/specs/lib/isGzippedSpec.js @@ -9,15 +9,15 @@ describe('isGzipped', function() { it('throws DeveloperError if data is undefined', function() { expect(function() { isGzipped(undefined); - }).toThrowError(); + }).toThrowDeveloperError(); }); it('detects when data is gzipped', function(done) { var data = new Buffer(40); - expect(isGzipped(data)).toBeFalsy(); + expect(isGzipped(data)).toBe(false); expect(zlibGzip(data, undefined) .then(function(zippedData) { - expect(isGzipped(zippedData)).toBeTruthy(); + expect(isGzipped(zippedData)).toBe(true); }), done).toResolve(); }); }); \ No newline at end of file diff --git a/tools/specs/lib/readTileSpec.js b/tools/specs/lib/readTileSpec.js index fbc442a9..58e975ae 100644 --- a/tools/specs/lib/readTileSpec.js +++ b/tools/specs/lib/readTileSpec.js @@ -2,11 +2,10 @@ var readTile = require('../../lib/readTile'); describe('readTile', function() { - it('throws DeveloperError if filePath is undefined', function(done) { - expect(readTile(undefined) - .catch(function(error) { - expect(error).toBeDefined(); - }), done).toResolve(); + it('throws DeveloperError if filePath is undefined', function() { + expect(function() { + readTile(); + }).toThrowDeveloperError(); }); it('reads a tile', function(done) { diff --git a/tools/specs/lib/writeTileSpec.js b/tools/specs/lib/writeTileSpec.js index 15f7e7f4..3f7d12fd 100644 --- a/tools/specs/lib/writeTileSpec.js +++ b/tools/specs/lib/writeTileSpec.js @@ -15,18 +15,16 @@ describe('writeTile', function() { .then(done); }); - it('throws DeveloperError if filePath is undefined', function(done) { - expect(writeTile(undefined, new Buffer(0)) - .catch(function(error) { - expect(error).toBeDefined(); - }), done).toResolve(); + it('throws DeveloperError if filePath is undefined', function() { + expect(function() { + writeTile(undefined, new Buffer(0)) + }).toThrowDeveloperError(); }); - it('throws DeveloperError if tileData is undefined', function(done) { - expect(writeTile('', undefined) - .catch(function(error) { - expect(error).toBeDefined(); - }), done).toResolve(); + it('throws DeveloperError if tileData is undefined', function() { + expect(function() { + writeTile('', undefined) + }).toThrowDeveloperError(); }); it('writes a tile', function(done) { @@ -39,7 +37,7 @@ describe('writeTile', function() { .then(function(tileData) { var magic = tileData.toString('utf8', 0, 4); expect(magic).toEqual('i3dm'); - }),done).toResolve(); + }), done).toResolve(); }); it('writes a gzipped tile', function(done) { @@ -51,6 +49,6 @@ describe('writeTile', function() { }) .then(function(tileData) { expect(isGzipped(tileData)).toBeTruthy(); - }),done).toResolve(); + }), done).toResolve(); }); }); \ No newline at end of file From 7187eced74939d1739df74d38e1a2aaffb27bc3c Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:41:12 -0400 Subject: [PATCH 14/20] Reverted README changes --- generator/README.md | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/generator/README.md b/generator/README.md index 6687a676..a9b613f6 100644 --- a/generator/README.md +++ b/generator/README.md @@ -1,17 +1 @@ -Tools for generating sample 3D Tiles tilesets. - -# Make Composite Tile - -Creates a composite tile from multiple source tiles. - -## Example -`node ./bin/makeCompositeTile.js batched.b3dm instanced.i3dm points.pnts -o output/composite.cmpt` - -## Command-Line Flags - -| Flag | Description | Required | -| --- | --- | --- | -| `-o`, `--output` | Output path where the composite tile should be written. | No, default `output/composite.cmpt` | -| `-z`, `--gzip` | Gzip the output composite tile. | No, default `false` | - -All unflagged arguments are treated as source tiles to place in the composite tile. \ No newline at end of file +Tools for generating sample 3D Tiles tilesets. \ No newline at end of file From 1634430182b934a64eef72825344ff0fe3a1b8a6 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:51:25 -0400 Subject: [PATCH 15/20] Fixed fsExtra usage --- tools/lib/getFilesInDirectory.js | 10 +++++----- tools/lib/readTile.js | 6 +++--- tools/lib/runPipeline.js | 16 ++++++++-------- tools/lib/writeTile.js | 6 +++--- tools/specs/lib/getFilesInDirectorySpec.js | 20 ++++++++++---------- tools/specs/lib/gzipTilesetSpec.js | 22 +++++++++++----------- tools/specs/lib/writeTileSpec.js | 16 ++++++++-------- 7 files changed, 48 insertions(+), 48 deletions(-) diff --git a/tools/lib/getFilesInDirectory.js b/tools/lib/getFilesInDirectory.js index 0d5d0f31..30a61a73 100644 --- a/tools/lib/getFilesInDirectory.js +++ b/tools/lib/getFilesInDirectory.js @@ -1,13 +1,13 @@ 'use strict'; var Cesium = require('cesium'); var Promise = require('bluebird'); -var fs = require('fs'); +var fsExtra = require('fs-extra'); var path = require('path'); var defaultValue = Cesium.defaultValue; -var fsReaddir = Promise.promisify(fs.readdir); -var fsStat = Promise.promisify(fs.stat); +var fsExtraReaddir = Promise.promisify(fsExtra.readdir); +var fsExtraStat = Promise.promisify(fsExtra.stat); module.exports = getFilesInDirectory; @@ -22,9 +22,9 @@ function getFilesInDirectory(directory, options) { } function findFiles(directory, files, recursive, filter) { - return fsReaddir(directory).map(function(fileName) { + return fsExtraReaddir(directory).map(function(fileName) { var fullPath = path.join(directory, fileName); - return fsStat(fullPath) + return fsExtraStat(fullPath) .then(function(stats) { if (stats.isFile() && filter(fullPath)) { files.push(fullPath); diff --git a/tools/lib/readTile.js b/tools/lib/readTile.js index f0b5cc44..3cc4ae82 100644 --- a/tools/lib/readTile.js +++ b/tools/lib/readTile.js @@ -1,14 +1,14 @@ 'use strict'; var Cesium = require('cesium'); var Promise = require('bluebird'); -var fs = require('fs-extra'); +var fsExtra = require('fs-extra'); var zlib = require('zlib'); var isGzipped = require('./isGzipped'); var DeveloperError = Cesium.DeveloperError; var defined = Cesium.defined; -var fsReadFile = Promise.promisify(fs.readFile); +var fsExtraReadFile = Promise.promisify(fsExtra.readFile); var zlibGunzip = Promise.promisify(zlib.gunzip); module.exports = readTile; @@ -23,7 +23,7 @@ function readTile(filePath) { if (!defined(filePath)) { throw new DeveloperError('filePath must be defined'); } - return fsReadFile(filePath) + return fsExtraReadFile(filePath) .then(function(buffer) { if (isGzipped(buffer)) { return zlibGunzip(buffer); diff --git a/tools/lib/runPipeline.js b/tools/lib/runPipeline.js index 7f99566a..4a21c67e 100644 --- a/tools/lib/runPipeline.js +++ b/tools/lib/runPipeline.js @@ -1,7 +1,7 @@ 'use strict'; var Cesium = require('cesium'); var Promise = require('bluebird'); -var fs = require('fs-extra'); +var fsExtra = require('fs-extra'); var path = require('path'); var getWorkingDirectory = require('./getWorkingDirectory'); var gzipTileset = require('./gzipTileset'); @@ -10,9 +10,9 @@ var defaultValue = Cesium.defaultValue; var defined = Cesium.defined; var DeveloperError = Cesium.DeveloperError; -var fsCopy = Promise.promisify(fs.copy); -var fsEmptyDir = Promise.promisify(fs.emptyDir); -var fsRemove = Promise.promisify(fs.remove); +var fsExtraCopy = Promise.promisify(fsExtra.copy); +var fsExtraEmptyDir = Promise.promisify(fsExtra.emptyDir); +var fsExtraRemove = Promise.promisify(fsExtra.remove); module.exports = runPipeline; @@ -41,7 +41,7 @@ function runPipeline(pipeline, options) { path.join(path.dirname(inputDirectory), path.basename(inputDirectory) + '-processed'))); if (!defined(stages)) { - return fsCopy(inputDirectory, outputDirectory); + return fsExtraCopy(inputDirectory, outputDirectory); } options = defaultValue(options, defaultValue.EMPTY_OBJECT); @@ -98,7 +98,7 @@ function runPipeline(pipeline, options) { // Run the stages in sequence return Promise.each(stageObjects, function (stage) { - return fsEmptyDir(stage.options.outputDirectory) + return fsExtraEmptyDir(stage.options.outputDirectory) .then(function () { if (defined(logCallback)) { logCallback('Running ' + stage.name); @@ -107,8 +107,8 @@ function runPipeline(pipeline, options) { }); }).finally(function () { return Promise.all([ - fsRemove(workingDirectory1), - fsRemove(workingDirectory2) + fsExtraRemove(workingDirectory1), + fsExtraRemove(workingDirectory2) ]); }); } diff --git a/tools/lib/writeTile.js b/tools/lib/writeTile.js index 2263e35c..d6869666 100644 --- a/tools/lib/writeTile.js +++ b/tools/lib/writeTile.js @@ -1,14 +1,14 @@ 'use strict'; var Cesium = require('cesium'); var Promise = require('bluebird'); -var fs = require('fs-extra'); +var fsExtra = require('fs-extra'); var zlib = require('zlib'); var DeveloperError = Cesium.DeveloperError; var defaultValue = Cesium.defaultValue; var defined = Cesium.defined; -var fsOutputFile = Promise.promisify(fs.outputFile); +var fsExtraOutputFile = Promise.promisify(fsExtra.outputFile); var zlibGzip = Promise.promisify(zlib.gzip); module.exports = writeTile; @@ -38,6 +38,6 @@ function writeTile(filePath, tileData, options) { promise = Promise.resolve(tileData); } return promise.then(function(data) { - return fsOutputFile(filePath, data); + return fsExtraOutputFile(filePath, data); }); } \ No newline at end of file diff --git a/tools/specs/lib/getFilesInDirectorySpec.js b/tools/specs/lib/getFilesInDirectorySpec.js index 6fd8a0d2..947f74aa 100644 --- a/tools/specs/lib/getFilesInDirectorySpec.js +++ b/tools/specs/lib/getFilesInDirectorySpec.js @@ -1,28 +1,28 @@ 'use strict'; var Promise = require('bluebird'); -var fs = require('fs-extra'); +var fsExtra = require('fs-extra'); var path = require('path'); var isTileFile = require('../../lib/isTileFile'); var getFilesInDirectory = require('../../lib/getFilesInDirectory'); -var fsOutputFile = Promise.promisify(fs.outputFile); -var fsRemove = Promise.promisify(fs.remove); +var fsExtraOutputFile = Promise.promisify(fsExtra.outputFile); +var fsExtraRemove = Promise.promisify(fsExtra.remove); describe('getFilesInDirectory', function() { beforeAll(function(done) { Promise.all([ - fsOutputFile('tmp/0.b3dm', ''), - fsOutputFile('tmp/1.i3dm', ''), - fsOutputFile('tmp/0/2.cmpt', ''), - fsOutputFile('tmp/0/0/3.vctr', ''), - fsOutputFile('tmp/1/4.pnts', ''), - fsOutputFile('tmp/1/5.not-a-tile', '') + fsExtraOutputFile('tmp/0.b3dm', ''), + fsExtraOutputFile('tmp/1.i3dm', ''), + fsExtraOutputFile('tmp/0/2.cmpt', ''), + fsExtraOutputFile('tmp/0/0/3.vctr', ''), + fsExtraOutputFile('tmp/1/4.pnts', ''), + fsExtraOutputFile('tmp/1/5.not-a-tile', '') ]) .then(done); }); afterAll(function(done) { - fsRemove('tmp') + fsExtraRemove('tmp') .then(done); }); diff --git a/tools/specs/lib/gzipTilesetSpec.js b/tools/specs/lib/gzipTilesetSpec.js index 1732628d..59281a31 100644 --- a/tools/specs/lib/gzipTilesetSpec.js +++ b/tools/specs/lib/gzipTilesetSpec.js @@ -1,12 +1,12 @@ 'use strict'; -var fs = require('fs-extra'); +var fsExtra = require('fs-extra'); var Promise = require('bluebird'); var isGzippedFile = require('../../lib/isGzippedFile'); var gzipTileset = require('../../lib/gzipTileset'); -var fsOutputFile = Promise.promisify(fs.outputFile); -var fsReadFile = Promise.promisify(fs.readFile); -var fsRemove = Promise.promisify(fs.remove); +var fsExtraOutputFile = Promise.promisify(fsExtra.outputFile); +var fsExtraReadFile = Promise.promisify(fsExtra.readFile); +var fsExtraRemove = Promise.promisify(fsExtra.remove); var tilesetDirectory = './specs/data/TilesetOfTilesets/'; var tilesetJson = './specs/data/TilesetOfTilesets/tileset.json'; @@ -18,8 +18,8 @@ var ungzippedJson = './specs/data/TilesetOfTilesets-ungzipped/tileset.json'; describe('gzipTileset', function() { afterEach(function (done) { Promise.all([ - fsRemove(gzippedDirectory), - fsRemove(ungzippedDirectory) + fsExtraRemove(gzippedDirectory), + fsExtraRemove(ungzippedDirectory) ]).then(function() { done(); }); @@ -93,8 +93,8 @@ describe('gzipTileset', function() { return gzipTileset(gzipAgainOptions) .then(function() { var promises = [ - fsReadFile(gzippedJson), - fsReadFile(ungzippedJson) + fsExtraReadFile(gzippedJson), + fsExtraReadFile(ungzippedJson) ]; return Promise.all(promises) .then(function(contents) { @@ -113,8 +113,8 @@ describe('gzipTileset', function() { expect(gzipTileset(ungzipOptions) .then(function() { var promises = [ - fsReadFile(tilesetJson), - fsReadFile(ungzippedJson) + fsExtraReadFile(tilesetJson), + fsExtraReadFile(ungzippedJson) ]; return Promise.all(promises) .then(function(contents) { @@ -173,7 +173,7 @@ describe('gzipTileset', function() { it('accepts custom writeCallback that returns a promise', function (done) { var writeCallback = function(file, data) { - return fsOutputFile(file, data); + return fsExtraOutputFile(file, data); }; var gzipOptions = { inputDirectory : tilesetDirectory, diff --git a/tools/specs/lib/writeTileSpec.js b/tools/specs/lib/writeTileSpec.js index 3f7d12fd..757592e5 100644 --- a/tools/specs/lib/writeTileSpec.js +++ b/tools/specs/lib/writeTileSpec.js @@ -1,29 +1,29 @@ 'use strict'; var Promise = require('bluebird'); -var fs = require('fs-extra'); +var fsExtra = require('fs-extra'); var isGzipped = require('../../lib/isGzipped'); var writeTile = require('../../lib/writeTile'); -var fsReadFile = Promise.promisify(fs.readFile); -var fsRemove = Promise.promisify(fs.remove); +var fsExtraReadFile = Promise.promisify(fsExtra.readFile); +var fsExtraRemove = Promise.promisify(fsExtra.remove); var testOutputPath = './specs/data/.test/'; describe('writeTile', function() { afterAll(function(done) { - fsRemove(testOutputPath) + fsExtraRemove(testOutputPath) .then(done); }); it('throws DeveloperError if filePath is undefined', function() { expect(function() { - writeTile(undefined, new Buffer(0)) + writeTile(undefined, new Buffer(0)); }).toThrowDeveloperError(); }); it('throws DeveloperError if tileData is undefined', function() { expect(function() { - writeTile('', undefined) + writeTile('', undefined); }).toThrowDeveloperError(); }); @@ -32,7 +32,7 @@ describe('writeTile', function() { var data = new Buffer('i3dm'); expect(writeTile(path, data) .then(function() { - return fsReadFile(path); + return fsExtraReadFile(path); }) .then(function(tileData) { var magic = tileData.toString('utf8', 0, 4); @@ -45,7 +45,7 @@ describe('writeTile', function() { var data = new Buffer('i3dm'); expect(writeTile(path, data, {gzip : true}) .then(function() { - return fsReadFile(path); + return fsExtraReadFile(path); }) .then(function(tileData) { expect(isGzipped(tileData)).toBeTruthy(); From aad3cdb871db95283a8837e69b596c8f93be97e6 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:51:43 -0400 Subject: [PATCH 16/20] Removed samples from generator data --- generator/specs/data/justHeader.i3dm | Bin 32 -> 0 bytes generator/specs/data/justHeaderGzipped.i3dm | Bin 50 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 generator/specs/data/justHeader.i3dm delete mode 100644 generator/specs/data/justHeaderGzipped.i3dm diff --git a/generator/specs/data/justHeader.i3dm b/generator/specs/data/justHeader.i3dm deleted file mode 100644 index 43627d9ebd52b54798fb8c5137b75416307d4971..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32 Vcmc~aPRV6pU|NuU;k1e0$<%~|1ePRLHlG6=3 Date: Fri, 7 Oct 2016 12:52:10 -0400 Subject: [PATCH 17/20] Added makeCompositeTile to index --- tools/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/index.js b/tools/index.js index d112ef85..43a4bac1 100644 --- a/tools/index.js +++ b/tools/index.js @@ -1,4 +1,5 @@ module.exports = { gzipTileset : require('./lib/gzipTileset'), + makeCompositeTile : require('./lib/makeCompositeTile'), pipeline : require('./lib/runPipeline') }; From b63c911ee80e41c1644b4c5206a529c57b424e5a Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:53:01 -0400 Subject: [PATCH 18/20] Updated packages --- tools/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/package.json b/tools/package.json index 7f80dc26..73bba710 100644 --- a/tools/package.json +++ b/tools/package.json @@ -25,7 +25,7 @@ "bluebird": "3.4.1", "cesium": "1.24", "fs-extra": "0.30.0", - "uuid": "2.0.2", + "uuid": "^2.0.2", "yargs": "4.8.1" }, "devDependencies": { From dec3c9e0b20b13dbb0bf75cfe0721abd798268d1 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:54:01 -0400 Subject: [PATCH 19/20] Removed rimraf --- generator/package.json | 1 - tools/package.json | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/generator/package.json b/generator/package.json index 11fe685f..f643d299 100644 --- a/generator/package.json +++ b/generator/package.json @@ -38,7 +38,6 @@ "open": "0.0.5", "request": "2.74.0", "requirejs": "2.2.0", - "rimraf": "2.5.4" }, "scripts": { "jsHint": "gulp jsHint", diff --git a/tools/package.json b/tools/package.json index 73bba710..7f80dc26 100644 --- a/tools/package.json +++ b/tools/package.json @@ -25,7 +25,7 @@ "bluebird": "3.4.1", "cesium": "1.24", "fs-extra": "0.30.0", - "uuid": "^2.0.2", + "uuid": "2.0.2", "yargs": "4.8.1" }, "devDependencies": { From d7a15aac4a883182b491b85bf4afcc54f4e61801 Mon Sep 17 00:00:00 2001 From: Robert Taglang Date: Fri, 7 Oct 2016 12:54:45 -0400 Subject: [PATCH 20/20] Reverted package.json --- generator/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/generator/package.json b/generator/package.json index f643d299..22ff66e6 100644 --- a/generator/package.json +++ b/generator/package.json @@ -23,11 +23,10 @@ }, "dependencies": { "bluebird": "3.4.1", - "cesium": "1.24", - "fs-extra": "0.30.0", - "yargs": "5.0.0" + "cesium": "1.24" }, "devDependencies": { + "fs-extra": "0.30.0", "gulp": "3.9.1", "gulp-jshint": "2.0.1", "istanbul": "0.4.4", @@ -38,6 +37,7 @@ "open": "0.0.5", "request": "2.74.0", "requirejs": "2.2.0", + "yargs": "4.8.1" }, "scripts": { "jsHint": "gulp jsHint",