Skip to content

Commit

Permalink
Moved out getJointCountForMaterials as a separate function and added
Browse files Browse the repository at this point in the history
pbr->materialsCommon generation
  • Loading branch information
lasalvavida committed Apr 28, 2017
1 parent 06a0954 commit d373dc2
Show file tree
Hide file tree
Showing 7 changed files with 440 additions and 203 deletions.
2 changes: 2 additions & 0 deletions gulpfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -285,9 +285,11 @@ gulp.task('build-cesium', function () {
'findAccessorMinMax.js',
'ForEach.js',
'getAccessorByteStride.js',
'getJointCountForMaterials.js',
'getStatistics.js',
'numberOfComponentsForType.js',
'parseBinaryGltf.js',
'pbrToMaterialsCommon.js',
'processModelMaterialsCommon.js',
'removePipelineExtras.js',
'removeExtensionsRequired.js',
Expand Down
184 changes: 67 additions & 117 deletions lib/generateModelMaterialsCommon.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
'use strict';
var Cesium = require('cesium');
var addExtensionsRequired = require('./addExtensionsRequired');
var ForEach = require('./ForEach');
var getJointCountForMaterials = require('./getJointCountForMaterials');

var defaultValue = Cesium.defaultValue;
var defined = Cesium.defined;
Expand All @@ -26,7 +28,6 @@ function generateModelMaterialsCommon(gltf, kmcOptions) {
kmcOptions.technique = defaultValue(kmcOptions.technique, 'PHONG');
addExtensionsRequired(gltf, 'KHR_materials_common');
var materialsCommon;
var materials = gltf.materials;
var nodes = gltf.nodes;
var techniques = gltf.techniques;
var jointCountForMaterialId = getJointCountForMaterials(gltf);
Expand All @@ -41,133 +42,82 @@ function generateModelMaterialsCommon(gltf, kmcOptions) {
var lights = {};
materialsCommon.lights = lights;

for (var materialId in materials) {
if (materials.hasOwnProperty(materialId)) {
var material = materials[materialId];
var technique = techniques[material.technique];
var techniqueParameters = technique.parameters;
if (defined(techniqueParameters.ambient) && !defined(lights.defaultAmbient)) {
lights.defaultAmbient = {
ambient: {
color: [1, 1, 1]
},
name: 'defaultAmbient',
type: 'ambient'
};
}
for (var parameterId in techniqueParameters) {
if (techniqueParameters.hasOwnProperty(parameterId)) {
if (parameterId.indexOf('light') === 0 && parameterId.indexOf('Transform') >= 0) {
var lightId = parameterId.substring(0, parameterId.indexOf('Transform'));
var lightTransform = techniqueParameters[parameterId];
var lightNodeId = lightTransform.node;
var lightNode = nodes[lightNodeId];
var nodeExtensions = lightNode.extensions;
if (!defined(nodeExtensions)) {
nodeExtensions = {};
lightNode.extensions = nodeExtensions;
}
materialsCommon = {};
nodeExtensions.KHR_materials_common = materialsCommon;
materialsCommon.light = lightId;
var lightColor = techniqueParameters[lightId + 'Color'];
var light = {
name: lightId,
type: 'directional',
directional: {
color: defaultValue(lightColor.value, [1, 1, 1])
}
};
lights[lightId] = light;
ForEach.material(gltf, function(material, materialId) {
var technique = techniques[material.technique];
var techniqueParameters = technique.parameters;
if (defined(techniqueParameters.ambient) && !defined(lights.defaultAmbient)) {
lights.defaultAmbient = {
ambient: {
color: [1, 1, 1]
},
name: 'defaultAmbient',
type: 'ambient'
};
}
for (var parameterId in techniqueParameters) {
if (techniqueParameters.hasOwnProperty(parameterId)) {
if (parameterId.indexOf('light') === 0 && parameterId.indexOf('Transform') >= 0) {
var lightId = parameterId.substring(0, parameterId.indexOf('Transform'));
var lightTransform = techniqueParameters[parameterId];
var lightNodeId = lightTransform.node;
var lightNode = nodes[lightNodeId];
var nodeExtensions = lightNode.extensions;
if (!defined(nodeExtensions)) {
nodeExtensions = {};
lightNode.extensions = nodeExtensions;
}
materialsCommon = {};
nodeExtensions.KHR_materials_common = materialsCommon;
materialsCommon.light = lightId;
var lightColor = techniqueParameters[lightId + 'Color'];
var light = {
name: lightId,
type: 'directional',
directional: {
color: defaultValue(lightColor.value, [1, 1, 1])
}
};
lights[lightId] = light;
}
}
}

delete material.technique;
var extensions = material.extensions;
if (!defined(extensions)) {
extensions = {};
material.extensions = extensions;
}
materialsCommon = {};
extensions.KHR_materials_common = materialsCommon;
for (var kmcOption in kmcOptions) {
if (kmcOptions.hasOwnProperty(kmcOption) && kmcOption !== 'enable') {
materialsCommon[kmcOption] = kmcOptions[kmcOption];
}
}
var jointCount = jointCountForMaterialId[materialId];
if (defined(jointCount)) {
materialsCommon.jointCount = jointCount;
delete material.technique;
var extensions = material.extensions;
if (!defined(extensions)) {
extensions = {};
material.extensions = extensions;
}
materialsCommon = {};
extensions.KHR_materials_common = materialsCommon;
for (var kmcOption in kmcOptions) {
if (kmcOptions.hasOwnProperty(kmcOption) && kmcOption !== 'enable') {
materialsCommon[kmcOption] = kmcOptions[kmcOption];
}
}
var jointCount = jointCountForMaterialId[materialId];
if (defined(jointCount)) {
materialsCommon.jointCount = jointCount;
}

var materialValues = material.values;
var diffuseColor, transparency;
if (defined(materialValues)) {
diffuseColor = materialValues.diffuse;
transparency = materialValues.transparency;
materialsCommon.values = materialValues;
}
var materialValues = material.values;
var diffuseColor, transparency;
if (defined(materialValues)) {
diffuseColor = materialValues.diffuse;
transparency = materialValues.transparency;
materialsCommon.values = materialValues;
}

// Check if we have transparency and set transparent flag
if ((defined(transparency) && transparency < 1.0) ||
(defined(diffuseColor) && Array.isArray(diffuseColor) && diffuseColor[3] < 1.0)) {
materialsCommon.values.transparent = true;
}
delete material.values;
// Check if we have transparency and set transparent flag
if ((defined(transparency) && transparency < 1.0) ||
(defined(diffuseColor) && Array.isArray(diffuseColor) && diffuseColor[3] < 1.0)) {
materialsCommon.values.transparent = true;
}
}
delete material.values;
});
delete gltf.techniques;
delete gltf.programs;
delete gltf.shaders;
return gltf;
}

function getJointCountForMaterials(gltf) {
var accessors = gltf.accessors;
var meshes = gltf.meshes;
var nodes = gltf.nodes;
var skins = gltf.skins;
var jointCountForMaterialId = {};

var nodesForSkinId = {};
for (var nodeId in nodes) {
if (nodes.hasOwnProperty(nodeId)) {
var node = nodes[nodeId];
if (defined(node.skin)) {
if (!defined(nodesForSkinId[node.skin])) {
nodesForSkinId[node.skin] = [];
}
nodesForSkinId[node.skin].push(node);
}
}
}

for (var skinId in skins) {
if (skins.hasOwnProperty(skinId)) {
var skin = skins[skinId];
var jointCount = 1;
if (defined(skin.inverseBindMatrices)) {
jointCount = accessors[skin.inverseBindMatrices].count;
}
var skinnedNodes = nodesForSkinId[skinId];
var skinnedNodesLength = skinnedNodes.length;
for (var i = 0; i < skinnedNodesLength; i++) {
var skinnedNode = skinnedNodes[i];
var nodeMeshes = skinnedNode.meshes;
var nodeMeshesLength = nodeMeshes.length;
for (var j = 0; j < nodeMeshesLength; j++) {
var meshId = nodeMeshes[j];
var mesh = meshes[meshId];
var primitives = mesh.primitives;
var primitivesLength = primitives.length;
for (var k = 0; k < primitivesLength; k++) {
var primitive = primitives[k];
jointCountForMaterialId[primitive.material] = jointCount;
}
}
}
}
}
return jointCountForMaterialId;
}
47 changes: 47 additions & 0 deletions lib/getJointCountForMaterials.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
'use strict';
var Cesium = require('cesium');
var ForEach = require('./ForEach');

var defined = Cesium.defined;

module.exports = getJointCountForMaterials;

function getJointCountForMaterials(gltf) {
var accessors = gltf.accessors;
var meshes = gltf.meshes;
var jointCountForMaterialId = {};

var nodesForSkinId = {};
ForEach.node(gltf, function(node) {
if (defined(node.skin)) {
if (!defined(nodesForSkinId[node.skin])) {
nodesForSkinId[node.skin] = [];
}
nodesForSkinId[node.skin].push(node);
}
});

ForEach.skin(gltf, function(skin, skinId) {
var jointCount = 1;
if (defined(skin.inverseBindMatrices)) {
jointCount = accessors[skin.inverseBindMatrices].count;
}
var skinnedNodes = nodesForSkinId[skinId];
var skinnedNodesLength = skinnedNodes.length;
for (var i = 0; i < skinnedNodesLength; i++) {
var skinnedNode = skinnedNodes[i];
var meshId = skinnedNode.mesh;
if (defined(meshId)) {
var mesh = meshes[meshId];
var primitives = mesh.primitives;
var primitivesLength = primitives.length;
for (var k = 0; k < primitivesLength; k++) {
var primitive = primitives[k];
jointCountForMaterialId[primitive.material] = jointCount;
}
}
}
});

return jointCountForMaterialId;
}

0 comments on commit d373dc2

Please sign in to comment.