Skip to content

Commit

Permalink
Merge pull request #41 from AnalyticalGraphicsInc/addPipelineExtras
Browse files Browse the repository at this point in the history
Added addPipelineExtras stage
  • Loading branch information
pjcozzi committed Apr 8, 2016
2 parents 8eea3f8 + e86a46c commit 4237961
Show file tree
Hide file tree
Showing 46 changed files with 5,676 additions and 425 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ Thumbs.db
.gitconfig
.idea/workspace.xml
.idea/tasks.xml
.bash_history
1 change: 1 addition & 0 deletions bin/gltf-pipeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ var removeUnused = require('../').removeUnused;
var loadGltfUris = require('../').loadGltfUris;
var writeGltf = require('../').writeGltf;
var parseBinaryGltf = require('../').parseBinaryGltf;
var addPipelineExtras = require('../').addPipelineExtras;
var OptimizationStatistics = require('../').OptimizationStatistics;
var Cesium = require('cesium');
var defined = Cesium.defined;
Expand Down
1 change: 1 addition & 0 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,6 @@ module.exports = {
loadGltfUris : require('./lib/loadGltfUris'),
writeGltf : require('./lib/writeGltf'),
parseBinaryGltf : require('./lib/parseBinaryGltf'),
writeBinaryGltf : require('./lib/writeBinaryGltf'),
OptimizationStatistics : require('./lib/OptimizationStatistics')
};
111 changes: 111 additions & 0 deletions lib/addPipelineExtras.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
'use strict';
var Cesium = require('cesium');
var defined = Cesium.defined;
var defaultValue = Cesium.defaultValue;

module.exports = addPipelineExtras;

//Add the pipeline extras object to each glTF object.
function addPipelineExtras(gltf) {
var reference = {
"accessors": { "accessorObject": { "addPipelineExtra": true } },
"animations": {
"animationObject": {
"channels": [
{
"target": { "addPipelineExtra": true },
"addPipelineExtra": true
}
],
"samplers": { "samplerObject": { "addPipelineExtra": true } },
"addPipelineExtra": true
}
},
"asset": {
"profile": { "addPipelineExtra": true },
"addPipelineExtra": true
},
"buffers": { "bufferObject": { "addPipelineExtra": true } },
"bufferViews": { "bufferViewObject": { "addPipelineExtra": true } },
"cameras": {
"cameraObject": {
"orthographic": { "addPipelineExtra": true },
"perspective": { "addPipelineExtra": true },
"addPipelineExtra": true
}
},
"images": { "imageObject": { "addPipelineExtra": true } },
"materials": { "materialObject": { "addPipelineExtra": true } },
"meshes": {
"meshObject": {
"primitives": [
{ "addPipelineExtra": true }
],
"addPipelineExtra": true
}
},
"nodes": { "nodeObject": { "addPipelineExtra": true } },
"programs": { "programObject": { "addPipelineExtra": true } },
"samplers": { "samplerObject": { "addPipelineExtra": true } },
"scenes": { "sceneObject": { "addPipelineExtra": true } },
"shaders": { "shaderObject": { "addPipelineExtra": true } },
"skins": { "skinObject": { "addPipelineExtra": true } },
"techniques": {
"techniqueObject": {
"parameters": { "parameterObject": { "addPipelineExtra": true } },
"states": {
"functions": { "addPipelineExtra": true },
"addPipelineExtra": true
},
"addPipelineExtra": true
}
},
"textures": { "textureObject": { "addPipelineExtra": true } },
"addPipelineExtra": true
};

addPipelineExtra(gltf, reference);

return gltf;
}

function addPipelineExtra(object, reference) {
if (defined(reference) && defined(object) && typeof object === 'object') {
if (defined(reference.addPipelineExtra)) {
if (defined(object.extras)) {
object.extras._pipeline = {
"deleteExtras": false
};
}
else {
object.extras = {
"_pipeline": {
"deleteExtras": true
}
};
}
}

for (var propertyId in object) {
if (object.hasOwnProperty(propertyId) && propertyId !== 'extras') {
var property = object[propertyId];

if (reference.hasOwnProperty(propertyId)) {
addPipelineExtra(property, reference[propertyId]);
}
else {
for (var referencePropertyId in reference) {
if (reference.hasOwnProperty(referencePropertyId)) {
var referenceProperty = reference[referencePropertyId];
if (typeof referenceProperty === 'object') {
addPipelineExtra(property, referenceProperty);
}
}
}
}
}
}
}

return object;
}
59 changes: 59 additions & 0 deletions lib/mergeBuffers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*jshint loopfunc: true */
'use strict';
var Cesium = require('cesium');
var defined = Cesium.defined;
var defaultValue = Cesium.defaultValue;
var objectValues = require('object-values');

module.exports = mergeBuffers;

//Merge all buffers into one buffer
function mergeBuffers(gltf, bufferName) {
var buffers = gltf.buffers;
var bufferViews = gltf.bufferViews;

if (defined(buffers)) {
var currentOffset = 0;
var source = new Buffer(0);

for (var bufferId in buffers) {
if (buffers.hasOwnProperty(bufferId)) {
//Add the buffer to the merged source
var buffer = buffers[bufferId];
source = Buffer.concat([source, buffer.extras._pipeline.source]);

if (defined(bufferViews)) {
//Update the offset for each accessing bufferView
var accessingBufferViews = objectValues(bufferViews);
accessingBufferViews = accessingBufferViews.filter(function(bufferView) {
return bufferView.buffer === bufferId;
});
var maxEndOffset = 0;
for (var i = 0; i < accessingBufferViews.length; i++) {
var currentView = accessingBufferViews[i];
maxEndOffset = Math.max(maxEndOffset, currentView.byteOffset + currentView.byteLength);
currentView.buffer = bufferName;
currentView.byteOffset += currentOffset;
}
currentOffset += maxEndOffset;
}
}
}

//Replace existing buffer with new merged buffer
gltf.buffers = {};
gltf.buffers[bufferName] = {
"type": "arraybuffer",
"byteLength": source.length,
"uri": "data:,",
"extras": {
"_pipeline": {
"source": source,
"deleteExtras": true
}
}
};
}

return gltf;
}
21 changes: 15 additions & 6 deletions lib/parseBinaryGltf.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ var defaultValue = Cesium.defaultValue;
var bufferEqual = require('buffer-equal');
var objectValues = require('object-values');
var StringDecoder = require('string_decoder').StringDecoder;
var addPipelineExtras = require('./addPipelineExtras');

module.exports = parseBinaryGltf;

Expand Down Expand Up @@ -40,6 +41,7 @@ function parseBinaryGltf(data) {
var decoder = new StringDecoder();
var scene = decoder.write(data.slice(byteOffset, byteOffset + sceneLength));
var gltf = JSON.parse(scene);
addPipelineExtras(gltf);

//Extract binary body
byteOffset += sceneLength;
Expand All @@ -62,8 +64,6 @@ function parseBinaryGltf(data) {
for (var bufferViewId in bufferViews) {
if (bufferViews.hasOwnProperty(bufferViewId)) {
var bufferView = bufferViews[bufferViewId];
bufferView.extras = defaultValue(bufferView.extras, {});
bufferView.extras._pipeline = defaultValue(bufferView.extras._pipeline, {});
bufferView.extras._pipeline.id = bufferViewId;
}
}
Expand Down Expand Up @@ -118,14 +118,22 @@ function parseBinaryGltf(data) {
"uri": "data:,",
"extras": {
"_pipeline": {
"source": body.slice(viewStart, viewEnd)
"source": body.slice(viewStart, viewEnd),
"deleteExtras": true //Move to addPipelineExtras
}
}
};
}
}
delete gltf.buffers.binary_glTF;
}
}
//Remove the KHR_binary_glTF extension
gltf.extensionsUsed = gltf.extensionsUsed.filter(function(extension) {
return extension !== 'KHR_binary_glTF';
});
if (Object.keys(gltf.extensionsUsed).length === 0) {
delete gltf.extensionsUsed;
}

return gltf;
}
Expand All @@ -142,8 +150,6 @@ function loadSourceFromBody(gltf, body, name, usedBufferViews) {
var viewId = objectExtensions.KHR_binary_glTF.bufferView;
var bufferView = gltf.bufferViews[viewId];
var source = body.slice(bufferView.byteOffset, bufferView.byteOffset + bufferView.byteLength);
object.extras = defaultValue(object.extras, {});
object.extras._pipeline = defaultValue(object.extras._pipeline, {});
object.extras._pipeline.source = source;

if (name === 'shaders') {
Expand All @@ -153,6 +159,9 @@ function loadSourceFromBody(gltf, body, name, usedBufferViews) {
object.extras._pipeline.extension = getBinaryImageFormat(source.slice(0, 2));
}
delete object.extensions.KHR_binary_glTF;
if (Object.keys(object.extensions).length === 0) {
delete object.extensions;
}

//Delete the original referenced bufferView if not used anywhere else
if (!defined(usedBufferViews[viewId])) {
Expand Down
39 changes: 18 additions & 21 deletions lib/removePipelineExtras.js
Original file line number Diff line number Diff line change
@@ -1,32 +1,29 @@
'use strict';
var Cesium = require('cesium');
var defined = Cesium.defined;
var defaultValue = Cesium.defaultValue;

module.exports = removePipelineExtras;

function removePipelineExtras(gltf) {
//Iterate through the objects within each glTF object and delete their pipeline extras object
if (defined(gltf)) {
for (var gltfObjectId in gltf) {
if (gltf.hasOwnProperty(gltfObjectId)) {
var gltfObject = gltf[gltfObjectId];
for (var objectId in gltfObject) {
if (gltfObject.hasOwnProperty(objectId)) {
var object = gltfObject[objectId];
if (defined(object.extras)) {
if (defined(object.extras._pipeline)) {
delete object.extras._pipeline;
}
//Also delete extras if extras._pipeline is the only extras object
if (Object.keys(object.extras).length === 0) {
delete object.extras;
}
}
}
}
//Iterate through the objects within each glTF object and delete their pipeline extras object
function removePipelineExtras(object) {
if (defined(object) && typeof object === 'object') {
if (defined(object.extras) && defined(object.extras._pipeline)) {
var deleteExtras = defaultValue(object.extras._pipeline.deleteExtras, true);
delete object.extras._pipeline;
//Also delete extras if extras._pipeline is the only extras object
if (deleteExtras && Object.keys(object.extras).length === 0) {
delete object.extras;
}
}

//Recursively check subproperties for extras
for (var propertyId in object) {
if (object.hasOwnProperty(propertyId)) {
removePipelineExtras(object[propertyId]);
}
}
}

return gltf;
return object;
}
Loading

0 comments on commit 4237961

Please sign in to comment.