diff --git a/lib/generateNormals.js b/lib/generateNormals.js index 0cb79079..6bf7601b 100644 --- a/lib/generateNormals.js +++ b/lib/generateNormals.js @@ -5,6 +5,7 @@ var clone = require('clone'); var Cartesian3 = Cesium.Cartesian3; var GeometryPipeline = Cesium.GeometryPipeline; var WebGLConstants = Cesium.WebGLConstants; +var CesiumMath = Cesium.Math; var defaultValue = Cesium.defaultValue; var defined = Cesium.defined; @@ -127,8 +128,23 @@ function generateFaceNormals(gltf, primitive, positionSemantic) { Cartesian3.subtract(positionTwo, positionOne, scratchNormalOne); Cartesian3.subtract(positionThree, positionOne, scratchNormalTwo); var normal = new Cartesian3(); - Cartesian3.cross(scratchNormalOne, scratchNormalTwo, normal); - Cartesian3.normalize(normal, normal); + + // Check for degenerate triangles + if (scratchNormalOne.equals(Cartesian3.ZERO) || scratchNormalTwo.equals(Cartesian3.ZERO)) { + Cartesian3.clone(Cartesian3.UNIT_X, normal); + } else { + Cartesian3.normalize(scratchNormalOne, scratchNormalOne); + Cartesian3.normalize(scratchNormalTwo, scratchNormalTwo); + + // Make sure normals aren't parallel + var dot = Math.abs(Cartesian3.dot(scratchNormalOne, scratchNormalTwo)); + if (CesiumMath.equalsEpsilon(dot, 1.0, CesiumMath.EPSILON15)) { + Cartesian3.clone(Cartesian3.UNIT_X, normal); + } else { + Cartesian3.cross(scratchNormalOne, scratchNormalTwo, normal); + Cartesian3.normalize(normal, normal); + } + } generatedNormals.push(normal); generatedNormals.push(normal); generatedNormals.push(normal); diff --git a/lib/mergeBuffers.js b/lib/mergeBuffers.js index 913278e7..65cf254f 100644 --- a/lib/mergeBuffers.js +++ b/lib/mergeBuffers.js @@ -41,8 +41,19 @@ function mergeBuffers(gltf, bufferId) { bufferView.buffer = bufferId; } } - buffersToMerge.push(buffer.extras._pipeline.source); - lengthSoFar += buffer.extras._pipeline.source.length; + + var sourceBuffer = buffer.extras._pipeline.source; + var currentBufferLength = sourceBuffer.length; + if (currentBufferLength % 4) + { + currentBufferLength += 4 - (currentBufferLength % 4); + var newBuffer = Buffer.alloc(currentBufferLength); + sourceBuffer.copy(newBuffer); + sourceBuffer = buffer.extras._pipeline.source = newBuffer; + } + + buffersToMerge.push(sourceBuffer); + lengthSoFar += currentBufferLength; } } @@ -85,4 +96,4 @@ function getBufferViewsForBuffers(gltf) { } } return bufferViewsForBuffers; -} \ No newline at end of file +} diff --git a/specs/lib/mergeBuffersSpec.js b/specs/lib/mergeBuffersSpec.js index fdf76a21..bba7e7db 100644 --- a/specs/lib/mergeBuffersSpec.js +++ b/specs/lib/mergeBuffersSpec.js @@ -6,7 +6,7 @@ describe('mergeBuffers', function() { it('merges buffers', function() { var buffer0 = Buffer.from([1, 2]); var buffer1 = Buffer.from([3, 4, 5]); - var bufferMerged = Buffer.from([1, 2, 3, 4, 5]); + var bufferMerged = Buffer.from([1, 2, 0, 0, 3, 4, 5, 0]); var gltf = { "bufferViews": { "bufferView_0": { @@ -58,12 +58,12 @@ describe('mergeBuffers', function() { "bufferView_1": { "buffer": "mergedBuffers", "byteLength": 3, - "byteOffset": 2 + "byteOffset": 4 } }, "buffers": { "mergedBuffers": { - "byteLength": 5, + "byteLength": 8, "type": "arraybuffer", "uri": "data:,", "extras": {