Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
188 additions
and
107 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,114 +1,51 @@ | ||
#!/usr/bin/env node | ||
'use strict'; | ||
var fs = require('fs'); | ||
var argv = require('yargs').argv; | ||
var path = require('path'); | ||
var argv = require('minimist')(process.argv.slice(2)); | ||
var addDefaults = require('../').addDefaults; | ||
var removeUnusedImages = require('../').removeUnusedImages; | ||
var removeUnusedSamplers = require('../').removeUnusedSamplers; | ||
var removeUnusedShaders = require('../').removeUnusedShaders; | ||
var removeUnusedTechniques = require('../').removeUnusedTechniques; | ||
var removeUnusedPrograms = require('../').removeUnusedPrograms; | ||
var removeUnusedBuffers = require('../').removeUnusedBuffers; | ||
var removeUnusedBufferViews = require('../').removeUnusedBufferViews; | ||
var removeUnusedMaterials = require('../').removeUnusedMaterials; | ||
var removeUnusedSkins = require('../').removeUnusedSkins; | ||
var removeUnusedCameras = require('../').removeUnusedCameras; | ||
var removeUnusedTextures = require('../').removeUnusedTextures; | ||
var removeUnusedMeshes = require('../').removeUnusedMeshes; | ||
var removeUnusedNodes = require('../').removeUnusedNodes; | ||
var removeUnusedAccessors = require('../').removeUnusedAccessors; | ||
var removeUnused = require('../').removeUnused; | ||
var loadGltfUris = require('../').loadGltfUris; | ||
var writeGltf = require('../').writeGltf; | ||
var parseBinaryGltf = require('../').parseBinaryGltf; | ||
var addPipelineExtras = require('../').addPipelineExtras; | ||
var convertDagToTree = require('../').convertDagToTree; | ||
var combineMeshes = require('../').combineMeshes; | ||
var combinePrimitives = require('../').combinePrimitives; | ||
var removeUnusedVertices = require('../').removeUnusedVertices; | ||
var OptimizationStatistics = require('../').OptimizationStatistics; | ||
var Cesium = require('cesium'); | ||
var defaultValue = Cesium.defaultValue; | ||
var defined = Cesium.defined; | ||
var writeGltf = require('./writeGltf'); | ||
var writeBinaryGltf = require('./writeBinaryGltf'); | ||
var gltfPipeline = require('../lib/gltfPipeline'); | ||
|
||
if (!defined(argv._[0]) || defined(argv.h) || defined(argv.help)) { | ||
var help = | ||
var help = | ||
'Usage: node ' + path.basename(__filename) + ' [path-to.gltf or path-to.bgltf] [OPTIONS]\n' + | ||
' -o=PATH Write optimized glTF to the specified file.\n'; | ||
' -i, input=PATH Read unoptimized glTF from the specified file.\n ' + | ||
' -b, write binary glTF file.\n' + | ||
' -s, writes out separate geometry/animation data files, shader files and textures instead of embedding them in the glTF file.\n ' + | ||
' -o, output=PATH write optimized glTF to the specified file.\n'; | ||
process.stdout.write(help); | ||
return; | ||
} | ||
|
||
var gltfPath = argv._[0]; | ||
var gltfPath = defaultValue(argv._[0], argv.i); | ||
var fileExtension = path.extname(gltfPath); | ||
var fileName = path.basename(gltfPath, fileExtension); | ||
var filePath = path.dirname(gltfPath); | ||
var outputPath = defaultValue(argv._[1], argv.o); | ||
|
||
fs.readFile(gltfPath, function (err, data) { | ||
if (err) { | ||
throw err; | ||
} | ||
|
||
var fileExtension = path.extname(gltfPath); | ||
var fileName = path.basename(gltfPath, fileExtension); | ||
var filePath = path.dirname(gltfPath); | ||
|
||
var gltf; | ||
if (fileExtension === '.glb') { | ||
gltf = parseBinaryGltf(data); | ||
} | ||
else if (fileExtension === '.gltf') { | ||
gltf = JSON.parse(data); | ||
} | ||
else { | ||
throw new Error('Invalid glTF file.'); | ||
} | ||
|
||
var stats = new OptimizationStatistics(); | ||
|
||
addDefaults(gltf, stats); | ||
|
||
// TODO: custom pipeline based on arguments / config | ||
removeUnused(gltf, stats); | ||
printStats(stats); | ||
|
||
addPipelineExtras(gltf); | ||
convertDagToTree(gltf); | ||
|
||
gltf = loadGltfUris(gltf, filePath, function(err) { | ||
if (err) { | ||
throw err; | ||
} | ||
if (!defined(outputPath)) { | ||
// Default output. For example, path/asset.gltf becomes path/asset-optimized.gltf | ||
outputPath = path.join(filePath, fileName + '-optimized' + fileExtension); | ||
} | ||
|
||
combineMeshes(gltf); | ||
combinePrimitives(gltf); | ||
var isSeparate = defaultValue(argv.s, false); | ||
var exportBinary = defaultValue(argv.b, false); | ||
|
||
removeUnusedVertices(gltf); | ||
var options = { | ||
inputPath : gltfPath | ||
}; | ||
|
||
var outputPath = argv.o; | ||
if (!defined(outputPath)) { | ||
// Default output. For example, path/asset.gltf becomes path/asset-optimized.gltf | ||
outputPath = path.join(filePath, fileName + '-optimized' + fileExtension); | ||
} | ||
gltfPipeline(options, function(gltf) { | ||
if (exportBinary) { | ||
writeBinaryGltf(gltf, outputPath, true); | ||
} else { | ||
writeGltf(gltf, outputPath, !isSeparate, true); | ||
} | ||
}); | ||
|
||
//Run removeUnused stage again after all pipeline stages have been run to remove objects that become unused | ||
removeUnused(gltf); | ||
|
||
var isEmbedded = true; | ||
writeGltf(gltf, outputPath, isEmbedded, true); | ||
}); | ||
}); | ||
|
||
function printStats(stats) { | ||
process.stdout.write('Nodes removed: ' + stats.numberRemoved.nodes + '\n'); | ||
process.stdout.write('Skins removed: ' + stats.numberRemoved.skins + '\n'); | ||
process.stdout.write('Cameras removed: ' + stats.numberRemoved.cameras + '\n'); | ||
process.stdout.write('Meshes removed: ' + stats.numberRemoved.meshes + '\n'); | ||
process.stdout.write('Accessors removed: ' + stats.numberRemoved.accessors + '\n'); | ||
process.stdout.write('Materials removed: ' + stats.numberRemoved.materials + '\n'); | ||
process.stdout.write('BufferViews removed: ' + stats.numberRemoved.bufferViews + '\n'); | ||
process.stdout.write('Techniques removed: ' + stats.numberRemoved.techniques + '\n'); | ||
process.stdout.write('Textures removed: ' + stats.numberRemoved.textures + '\n'); | ||
process.stdout.write('Buffers removed: ' + stats.numberRemoved.buffers + '\n'); | ||
process.stdout.write('Programs removed: ' + stats.numberRemoved.programs + '\n'); | ||
process.stdout.write('Images removed: ' + stats.numberRemoved.images + '\n'); | ||
process.stdout.write('Samplers removed: ' + stats.numberRemoved.samplers + '\n'); | ||
process.stdout.write('Shaders removed: ' + stats.numberRemoved.shaders + '\n'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
'use strict'; | ||
var fs = require('fs'); | ||
var path = require('path'); | ||
var addDefaults = require('./addDefaults'); | ||
var removeUnusedImages = require('./removeUnusedImages'); | ||
var removeUnusedSamplers = require('./removeUnusedSamplers'); | ||
var removeUnusedShaders = require('./removeUnusedShaders'); | ||
var removeUnusedTechniques = require('./removeUnusedTechniques'); | ||
var removeUnusedPrograms = require('./removeUnusedPrograms'); | ||
var removeUnusedBuffers = require('./removeUnusedBuffers'); | ||
var removeUnusedBufferViews = require('./removeUnusedBufferViews'); | ||
var removeUnusedMaterials = require('./removeUnusedMaterials'); | ||
var removeUnusedSkins = require('./removeUnusedSkins'); | ||
var removeUnusedCameras = require('./removeUnusedCameras'); | ||
var removeUnusedTextures = require('./removeUnusedTextures'); | ||
var removeUnusedMeshes = require('./removeUnusedMeshes'); | ||
var removeUnusedNodes = require('./removeUnusedNodes'); | ||
var removeUnusedAccessors = require('./removeUnusedAccessors'); | ||
var removeUnused = require('./removeUnused'); | ||
var loadGltfUris = require('./loadGltfUris'); | ||
var parseBinaryGltf = require('./parseBinaryGltf'); | ||
var addPipelineExtras = require('./addPipelineExtras'); | ||
var convertDagToTree = require('./convertDagToTree'); | ||
var combineMeshes = require('./combineMeshes'); | ||
var combinePrimitives = require('./combinePrimitives'); | ||
var removeUnusedVertices = require('./removeUnusedVertices'); | ||
var OptimizationStatistics = require('./OptimizationStatistics'); | ||
var Cesium = require('cesium'); | ||
var defined = Cesium.defined; | ||
var defaultValue = Cesium.defaultValue; | ||
var DeveloperError = Cesium.DeveloperError; | ||
|
||
module.exports = gltfPipeline; | ||
|
||
function gltfPipeline(options, callback) { | ||
var gltfPath = options.inputPath; | ||
|
||
if (!defined(gltfPath)) { | ||
throw new DeveloperError('Input path is undefined'); | ||
} | ||
|
||
var fileExtension = path.extname(gltfPath); | ||
var fileName = path.basename(gltfPath, fileExtension); | ||
var filePath = path.dirname(gltfPath); | ||
|
||
fs.readFile(gltfPath, function (err, data) { | ||
if (err) { | ||
throw err; | ||
} | ||
|
||
var gltf; | ||
if (fileExtension === '.glb') { | ||
gltf = parseBinaryGltf(data); | ||
} | ||
else if (fileExtension === '.gltf') { | ||
gltf = JSON.parse(data); | ||
addPipelineExtras(gltf); | ||
} | ||
else { | ||
throw new Error('Invalid glTF file.'); | ||
} | ||
|
||
var stats = new OptimizationStatistics(); | ||
|
||
addDefaults(gltf, stats); | ||
|
||
removeUnused(gltf, stats); | ||
printStats(stats); | ||
|
||
convertDagToTree(gltf); | ||
|
||
gltf = loadGltfUris(gltf, filePath, function (err) { | ||
if (err) { | ||
throw err; | ||
} | ||
|
||
combineMeshes(gltf); | ||
combinePrimitives(gltf); | ||
|
||
removeUnusedVertices(gltf); | ||
|
||
//Run removeUnused stage again after all pipeline stages have been run to remove objects that become unused | ||
removeUnused(gltf); | ||
|
||
callback(gltf); | ||
}); | ||
}); | ||
} | ||
|
||
function printStats(stats) { | ||
process.stdout.write('Nodes removed: ' + stats.numberRemoved.nodes + '\n'); | ||
process.stdout.write('Skins removed: ' + stats.numberRemoved.skins + '\n'); | ||
process.stdout.write('Cameras removed: ' + stats.numberRemoved.cameras + '\n'); | ||
process.stdout.write('Meshes removed: ' + stats.numberRemoved.meshes + '\n'); | ||
process.stdout.write('Accessors removed: ' + stats.numberRemoved.accessors + '\n'); | ||
process.stdout.write('Materials removed: ' + stats.numberRemoved.materials + '\n'); | ||
process.stdout.write('BufferViews removed: ' + stats.numberRemoved.bufferViews + '\n'); | ||
process.stdout.write('Techniques removed: ' + stats.numberRemoved.techniques + '\n'); | ||
process.stdout.write('Textures removed: ' + stats.numberRemoved.textures + '\n'); | ||
process.stdout.write('Buffers removed: ' + stats.numberRemoved.buffers + '\n'); | ||
process.stdout.write('Programs removed: ' + stats.numberRemoved.programs + '\n'); | ||
process.stdout.write('Images removed: ' + stats.numberRemoved.images + '\n'); | ||
process.stdout.write('Samplers removed: ' + stats.numberRemoved.samplers + '\n'); | ||
process.stdout.write('Shaders removed: ' + stats.numberRemoved.shaders + '\n'); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
'use strict'; | ||
var gltfPipeline = require('../../lib/gltfPipeline'); | ||
var writeBinaryGltf = require('../../lib/writeBinaryGltf'); | ||
var Cesium = require('cesium'); | ||
var defined = Cesium.defined; | ||
|
||
var gltfPath = './specs/data/boxTexturedUnoptimized/CesiumTexturedBoxTest.gltf'; | ||
var glbPath = './specs/data/boxTexturedUnoptimized/CesiumTexturedBoxTest.glb'; | ||
|
||
describe('gltfPipeline', function() { | ||
it('optimizes a gltf file, checks that gltf is defined when passing in a gltf file', function(done) { | ||
gltfPipeline({ | ||
inputPath : gltfPath, | ||
separate : false | ||
}, function(gltf) { | ||
expect(gltf).toBeDefined(); | ||
expect(gltf).not.toBe(gltfPath); | ||
done(); | ||
}); | ||
}); | ||
|
||
it('optimizes a binary glTF file, checks that gltf is defined when passing in a glb file', function(done) { | ||
gltfPipeline({ | ||
inputPath : glbPath, | ||
separate : false | ||
}, function(gltf) { | ||
expect(gltf).toBeDefined(); | ||
expect(gltf).not.toBe(glbPath); | ||
done(); | ||
}); | ||
}); | ||
}); |