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
7 changed files
with
206 additions
and
113 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,54 @@ | ||
#!/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; | ||
|
||
if (!defined(argv._[0]) || defined(argv.h) || defined(argv.help)) { | ||
var help = | ||
var writeGltf = require('../lib/writeGltf'); | ||
var writeBinaryGltf = require('../lib/writeBinaryGltf'); | ||
var gltfPipeline = require('../lib/gltfPipeline'); | ||
var addPipelineExtras = require('../lib/addPipelineExtras'); | ||
var readGltf = require('../lib/readGltf'); | ||
|
||
if (process.argv.length < 3 || defined(argv.h) || defined(argv.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]; | ||
|
||
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(); | ||
var gltfPath = defaultValue(argv._[0], argv.i); | ||
var fileExtension = path.extname(gltfPath); | ||
var fileName = path.basename(gltfPath, fileExtension); | ||
var filePath = path.dirname(gltfPath); | ||
|
||
addDefaults(gltf, stats); | ||
var outputPath = defaultValue(argv._[1], argv.o); | ||
var isSeparate = defaultValue(argv.s, false); | ||
var exportBinary = defaultValue(argv.b, false); | ||
|
||
// 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(gltfPath)) { | ||
throw new DeveloperError('Input path is undefined.'); | ||
} | ||
|
||
combineMeshes(gltf); | ||
combinePrimitives(gltf); | ||
if (fileExtension !== '.glb' && fileExtension !== '.gltf') { | ||
throw new DeveloperError('Invalid glTF file.'); | ||
} | ||
|
||
removeUnusedVertices(gltf); | ||
if (!defined(outputPath)) { | ||
// Default output. For example, path/asset.gltf becomes path/asset-optimized.gltf | ||
outputPath = path.join(filePath, fileName + '-optimized' + fileExtension); | ||
} | ||
|
||
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); | ||
readGltf(gltfPath, function(gltf) { | ||
gltfPipeline(gltf, 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,69 @@ | ||
'use strict'; | ||
var fs = require('fs'); | ||
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 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(gltfWithExtras, callback) { | ||
var stats = new OptimizationStatistics(); | ||
|
||
addDefaults(gltfWithExtras, stats); | ||
|
||
removeUnused(gltfWithExtras, stats); | ||
printStats(stats); | ||
|
||
convertDagToTree(gltfWithExtras); | ||
|
||
removeUnusedVertices(gltfWithExtras); | ||
|
||
combineMeshes(gltfWithExtras); | ||
combinePrimitives(gltfWithExtras); | ||
|
||
//Run removeUnused stage again after all pipeline stages have been run to remove objects that become unused | ||
removeUnused(gltfWithExtras); | ||
|
||
callback(gltfWithExtras); | ||
} | ||
|
||
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
'use strict'; | ||
var path = require('path'); | ||
var fs = require('fs'); | ||
var parseBinaryGltf = require('./parseBinaryGltf'); | ||
var addPipelineExtras = require('./addPipelineExtras'); | ||
var loadGltfUris = require('../lib/loadGltfUris'); | ||
var Cesium = require('cesium'); | ||
var defined = Cesium.defined; | ||
|
||
module.exports = readGltf; | ||
|
||
|
||
function readGltf(gltfPath, callback) { | ||
|
||
var fileExtension = path.extname(gltfPath); | ||
var filePath = path.dirname(gltfPath); | ||
|
||
|
||
if (!defined(gltfPath)) { | ||
throw new DeveloperError('Input path is undefined.'); | ||
} | ||
|
||
if (fileExtension !== '.glb' && fileExtension !== '.gltf') { | ||
throw new DeveloperError('Invalid glTF file.'); | ||
} | ||
|
||
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); | ||
} | ||
var gltf = loadGltfUris(gltf, filePath, function() { | ||
callback(gltf); | ||
}); | ||
}); | ||
} |
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
Oops, something went wrong.