diff --git a/Source/Scene/Primitive.js b/Source/Scene/Primitive.js index 33c20be3e4fe..6c4cd704a032 100644 --- a/Source/Scene/Primitive.js +++ b/Source/Scene/Primitive.js @@ -731,22 +731,10 @@ define([ for (i = 0; i < length; ++i) { geometry = instances[i].geometry; instanceIds.push(instances[i].id); - if (defined(geometry.constructor.pack)) { - var packedLength = defined(geometry.constructor.packedLength) ? geometry.constructor.packedLength : geometry.packedLength; - var array = new Float64Array(packedLength); - geometry.constructor.pack(geometry, array); - - subTasks.push({ - moduleName : geometry._workerName, - geometry : array, - transferableObjects : [array.buffer] - }); - } else { - subTasks.push({ - moduleName : geometry._workerName, - geometry : geometry - }); - } + subTasks.push({ + moduleName : geometry._workerName, + geometry : geometry + }); } if (!defined(createGeometryTaskProcessors)) { @@ -756,11 +744,41 @@ define([ } } + var subTask; subTasks = subdivideArray(subTasks, numberOfCreationWorkers); + for (i = 0; i < subTasks.length; i++) { + var packedLength = 0; + var workerSubTasks = subTasks[i]; + var workerSubTasksLength = workerSubTasks.length; + for (j = 0; j < workerSubTasksLength; ++j) { + subTask = workerSubTasks[j]; + geometry = subTask.geometry; + if (defined(geometry.constructor.pack)) { + subTask.offset = packedLength; + packedLength += defined(geometry.constructor.packedLength) ? geometry.constructor.packedLength : geometry.packedLength; + } + } + + var subTaskTransferableObjects; + + if (packedLength > 0) { + var array = new Float64Array(packedLength); + subTaskTransferableObjects = [array.buffer]; + + for (j = 0; j < workerSubTasksLength; ++j) { + subTask = workerSubTasks[j]; + geometry = subTask.geometry; + if (defined(geometry.constructor.pack)) { + geometry.constructor.pack(geometry, array, subTask.offset); + subTask.geometry = array; + } + } + } + promises.push(createGeometryTaskProcessors[i].scheduleTask({ subTasks : subTasks[i] - }, subTasks[i].transferableObjects)); + }, subTaskTransferableObjects)); } this._state = PrimitiveState.CREATING; diff --git a/Source/Workers/createBoxGeometry.js b/Source/Workers/createBoxGeometry.js index 47f26c085aaa..aaf24fbe30ee 100644 --- a/Source/Workers/createBoxGeometry.js +++ b/Source/Workers/createBoxGeometry.js @@ -7,9 +7,9 @@ define([ defined) { "use strict"; - return function(boxGeometry) { - if (defined(boxGeometry.buffer)) { - boxGeometry = BoxGeometry.unpack(boxGeometry); + return function(boxGeometry, offset) { + if (defined(offset)) { + boxGeometry = BoxGeometry.unpack(boxGeometry, offset); } return BoxGeometry.createGeometry(boxGeometry); }; diff --git a/Source/Workers/createBoxOutlineGeometry.js b/Source/Workers/createBoxOutlineGeometry.js index 22150ecd6869..0c0ac8ae76c4 100644 --- a/Source/Workers/createBoxOutlineGeometry.js +++ b/Source/Workers/createBoxOutlineGeometry.js @@ -7,9 +7,9 @@ define([ defined) { "use strict"; - return function(boxGeometry) { - if (defined(boxGeometry.buffer)) { - boxGeometry = BoxOutlineGeometry.unpack(boxGeometry); + return function(boxGeometry, offset) { + if (defined(offset)) { + boxGeometry = BoxOutlineGeometry.unpack(boxGeometry, offset); } return BoxOutlineGeometry.createGeometry(boxGeometry); }; diff --git a/Source/Workers/createCircleGeometry.js b/Source/Workers/createCircleGeometry.js index 957e1ddd1b31..3eba599f2d13 100644 --- a/Source/Workers/createCircleGeometry.js +++ b/Source/Workers/createCircleGeometry.js @@ -11,9 +11,9 @@ define([ Ellipsoid) { "use strict"; - function createCircleGeometry(circleGeometry) { - if (defined(circleGeometry.buffer)) { - circleGeometry = CircleGeometry.unpack(circleGeometry); + function createCircleGeometry(circleGeometry, offset) { + if (defined(offset)) { + circleGeometry = CircleGeometry.unpack(circleGeometry, offset); } circleGeometry._ellipseGeometry._center = Cartesian3.clone(circleGeometry._ellipseGeometry._center); circleGeometry._ellipseGeometry._ellipsoid = Ellipsoid.clone(circleGeometry._ellipseGeometry._ellipsoid); diff --git a/Source/Workers/createCircleOutlineGeometry.js b/Source/Workers/createCircleOutlineGeometry.js index 9de5d33fcfa6..5df6cc94814f 100644 --- a/Source/Workers/createCircleOutlineGeometry.js +++ b/Source/Workers/createCircleOutlineGeometry.js @@ -11,9 +11,9 @@ define([ Ellipsoid) { "use strict"; - function createCircleOutlineGeometry(circleGeometry) { - if (defined(circleGeometry.buffer)) { - circleGeometry = CircleOutlineGeometry.unpack(circleGeometry); + function createCircleOutlineGeometry(circleGeometry, offset) { + if (defined(offset)) { + circleGeometry = CircleOutlineGeometry.unpack(circleGeometry, offset); } circleGeometry._ellipseGeometry._center = Cartesian3.clone(circleGeometry._ellipseGeometry._center); circleGeometry._ellipseGeometry._ellipsoid = Ellipsoid.clone(circleGeometry._ellipseGeometry._ellipsoid); diff --git a/Source/Workers/createCorridorGeometry.js b/Source/Workers/createCorridorGeometry.js index 350343717c9e..ba673a27f803 100644 --- a/Source/Workers/createCorridorGeometry.js +++ b/Source/Workers/createCorridorGeometry.js @@ -9,9 +9,9 @@ define([ Ellipsoid) { "use strict"; - function createCorridorGeometry(corridorGeometry) { - if (defined(corridorGeometry.buffer)) { - corridorGeometry = CorridorGeometry.unpack(corridorGeometry); + function createCorridorGeometry(corridorGeometry, offset) { + if (defined(offset)) { + corridorGeometry = CorridorGeometry.unpack(corridorGeometry, offset); } corridorGeometry._ellipsoid = Ellipsoid.clone(corridorGeometry._ellipsoid); return CorridorGeometry.createGeometry(corridorGeometry); diff --git a/Source/Workers/createCorridorOutlineGeometry.js b/Source/Workers/createCorridorOutlineGeometry.js index 94e29ea44c03..45cca03cbc43 100644 --- a/Source/Workers/createCorridorOutlineGeometry.js +++ b/Source/Workers/createCorridorOutlineGeometry.js @@ -9,9 +9,9 @@ define([ Ellipsoid) { "use strict"; - function createCorridorOutlineGeometry(corridorOutlineGeometry) { - if (defined(corridorOutlineGeometry.buffer)) { - corridorOutlineGeometry = CorridorOutlineGeometry.unpack(corridorOutlineGeometry); + function createCorridorOutlineGeometry(corridorOutlineGeometry, offset) { + if (defined(offset)) { + corridorOutlineGeometry = CorridorOutlineGeometry.unpack(corridorOutlineGeometry, offset); } corridorOutlineGeometry._ellipsoid = Ellipsoid.clone(corridorOutlineGeometry._ellipsoid); return CorridorOutlineGeometry.createGeometry(corridorOutlineGeometry); diff --git a/Source/Workers/createCylinderGeometry.js b/Source/Workers/createCylinderGeometry.js index 62af53977377..309ea24cd175 100644 --- a/Source/Workers/createCylinderGeometry.js +++ b/Source/Workers/createCylinderGeometry.js @@ -7,9 +7,9 @@ define([ defined) { "use strict"; - return function(cylinderGeometry) { - if (defined(cylinderGeometry.buffer)) { - cylinderGeometry = CylinderGeometry.unpack(cylinderGeometry); + return function(cylinderGeometry, offset) { + if (defined(offset)) { + cylinderGeometry = CylinderGeometry.unpack(cylinderGeometry, offset); } return CylinderGeometry.createGeometry(cylinderGeometry); }; diff --git a/Source/Workers/createCylinderOutlineGeometry.js b/Source/Workers/createCylinderOutlineGeometry.js index 361afad3d105..e17895dd6608 100644 --- a/Source/Workers/createCylinderOutlineGeometry.js +++ b/Source/Workers/createCylinderOutlineGeometry.js @@ -7,9 +7,9 @@ define([ defined) { "use strict"; - return function(cylinderGeometry) { - if (defined(cylinderGeometry.buffer)) { - cylinderGeometry = CylinderOutlineGeometry.unpack(cylinderGeometry); + return function(cylinderGeometry, offset) { + if (defined(offset)) { + cylinderGeometry = CylinderOutlineGeometry.unpack(cylinderGeometry, offset); } return CylinderOutlineGeometry.createGeometry(cylinderGeometry); }; diff --git a/Source/Workers/createEllipseGeometry.js b/Source/Workers/createEllipseGeometry.js index c540b2cc5db7..626e24e3dbb3 100644 --- a/Source/Workers/createEllipseGeometry.js +++ b/Source/Workers/createEllipseGeometry.js @@ -11,9 +11,9 @@ define([ Ellipsoid) { "use strict"; - function createEllipseGeometry(ellipseGeometry) { - if (defined(ellipseGeometry.buffer)) { - ellipseGeometry = EllipseGeometry.unpack(ellipseGeometry); + function createEllipseGeometry(ellipseGeometry, offset) { + if (defined(offset)) { + ellipseGeometry = EllipseGeometry.unpack(ellipseGeometry, offset); } ellipseGeometry._center = Cartesian3.clone(ellipseGeometry._center); ellipseGeometry._ellipsoid = Ellipsoid.clone(ellipseGeometry._ellipsoid); diff --git a/Source/Workers/createEllipseOutlineGeometry.js b/Source/Workers/createEllipseOutlineGeometry.js index f16b372b5d1c..9a0ffe328e46 100644 --- a/Source/Workers/createEllipseOutlineGeometry.js +++ b/Source/Workers/createEllipseOutlineGeometry.js @@ -11,9 +11,9 @@ define([ Ellipsoid) { "use strict"; - function createEllipseOutlineGeometry(ellipseGeometry) { - if (defined(ellipseGeometry.buffer)) { - ellipseGeometry = EllipseOutlineGeometry.unpack(ellipseGeometry); + function createEllipseOutlineGeometry(ellipseGeometry, offset) { + if (defined(offset)) { + ellipseGeometry = EllipseOutlineGeometry.unpack(ellipseGeometry, offset); } ellipseGeometry._center = Cartesian3.clone(ellipseGeometry._center); ellipseGeometry._ellipsoid = Ellipsoid.clone(ellipseGeometry._ellipsoid); diff --git a/Source/Workers/createEllipsoidGeometry.js b/Source/Workers/createEllipsoidGeometry.js index 2d204e67d5c3..a5de0a49bc8d 100644 --- a/Source/Workers/createEllipsoidGeometry.js +++ b/Source/Workers/createEllipsoidGeometry.js @@ -7,9 +7,9 @@ define([ EllipsoidGeometry) { "use strict"; - return function(ellipsoidGeometry) { - if (defined(ellipsoidGeometry.buffer)) { - ellipsoidGeometry = EllipsoidGeometry.unpack(ellipsoidGeometry); + return function(ellipsoidGeometry, offset) { + if (defined(offset)) { + ellipsoidGeometry = EllipsoidGeometry.unpack(ellipsoidGeometry, offset); } return EllipsoidGeometry.createGeometry(ellipsoidGeometry); }; diff --git a/Source/Workers/createEllipsoidOutlineGeometry.js b/Source/Workers/createEllipsoidOutlineGeometry.js index 488cdd2d51ab..7f720a2df884 100644 --- a/Source/Workers/createEllipsoidOutlineGeometry.js +++ b/Source/Workers/createEllipsoidOutlineGeometry.js @@ -7,9 +7,9 @@ define([ EllipsoidOutlineGeometry) { "use strict"; - return function(ellipsoidGeometry) { - if (defined(ellipsoidGeometry.buffer)) { - ellipsoidGeometry = EllipsoidOutlineGeometry.unpack(ellipsoidGeometry); + return function(ellipsoidGeometry, offset) { + if (defined(ellipsoidGeometry.buffer, offset)) { + ellipsoidGeometry = EllipsoidOutlineGeometry.unpack(ellipsoidGeometry, offset); } return EllipsoidOutlineGeometry.createGeometry(ellipsoidGeometry); }; diff --git a/Source/Workers/createGeometry.js b/Source/Workers/createGeometry.js index 7570a29d5231..24570db39d42 100644 --- a/Source/Workers/createGeometry.js +++ b/Source/Workers/createGeometry.js @@ -36,7 +36,7 @@ define([ if (defined(moduleName)) { var createFunction = getModule(moduleName); - results.push(createFunction(geometry)); + results.push(createFunction(geometry, task.offset)); } else { //Already created geometry results.push(geometry); diff --git a/Source/Workers/createPolygonGeometry.js b/Source/Workers/createPolygonGeometry.js index 26946324a6e7..1f03cc8386af 100644 --- a/Source/Workers/createPolygonGeometry.js +++ b/Source/Workers/createPolygonGeometry.js @@ -9,9 +9,9 @@ define([ PolygonGeometry) { "use strict"; - function createPolygonGeometry(polygonGeometry) { - if (defined(polygonGeometry.buffer)) { - polygonGeometry = PolygonGeometry.unpack(polygonGeometry); + function createPolygonGeometry(polygonGeometry, offset) { + if (defined(offset)) { + polygonGeometry = PolygonGeometry.unpack(polygonGeometry, offset); } polygonGeometry._ellipsoid = Ellipsoid.clone(polygonGeometry._ellipsoid); return PolygonGeometry.createGeometry(polygonGeometry); diff --git a/Source/Workers/createPolygonOutlineGeometry.js b/Source/Workers/createPolygonOutlineGeometry.js index 7f1df76551f7..1c298701111e 100644 --- a/Source/Workers/createPolygonOutlineGeometry.js +++ b/Source/Workers/createPolygonOutlineGeometry.js @@ -9,9 +9,9 @@ define([ PolygonOutlineGeometry) { "use strict"; - function createPolygonOutlineGeometry(polygonGeometry) { - if (defined(polygonGeometry.buffer)) { - polygonGeometry = PolygonOutlineGeometry.unpack(polygonGeometry); + function createPolygonOutlineGeometry(polygonGeometry, offset) { + if (defined(offset)) { + polygonGeometry = PolygonOutlineGeometry.unpack(polygonGeometry, offset); } polygonGeometry._ellipsoid = Ellipsoid.clone(polygonGeometry._ellipsoid); return PolygonOutlineGeometry.createGeometry(polygonGeometry); diff --git a/Source/Workers/createPolylineGeometry.js b/Source/Workers/createPolylineGeometry.js index 75c414d44229..4fb72ce64831 100644 --- a/Source/Workers/createPolylineGeometry.js +++ b/Source/Workers/createPolylineGeometry.js @@ -9,9 +9,9 @@ define([ PolylineGeometry) { "use strict"; - function createPolylineGeometry(polylineGeometry) { - if (defined(polylineGeometry.buffer)) { - polylineGeometry = PolylineGeometry.unpack(polylineGeometry); + function createPolylineGeometry(polylineGeometry, offset) { + if (defined(offset)) { + polylineGeometry = PolylineGeometry.unpack(polylineGeometry, offset); } polylineGeometry._ellipsoid = Ellipsoid.clone(polylineGeometry._ellipsoid); return PolylineGeometry.createGeometry(polylineGeometry); diff --git a/Source/Workers/createPolylineVolumeGeometry.js b/Source/Workers/createPolylineVolumeGeometry.js index 106384c590c0..914b710246e7 100644 --- a/Source/Workers/createPolylineVolumeGeometry.js +++ b/Source/Workers/createPolylineVolumeGeometry.js @@ -9,9 +9,9 @@ define([ PolylineVolumeGeometry) { "use strict"; - function createPolylineVolumeGeometry(polylineVolumeGeometry) { - if (defined(polylineVolumeGeometry.buffer)) { - polylineVolumeGeometry = PolylineVolumeGeometry.unpack(polylineVolumeGeometry); + function createPolylineVolumeGeometry(polylineVolumeGeometry, offset) { + if (defined(offset)) { + polylineVolumeGeometry = PolylineVolumeGeometry.unpack(polylineVolumeGeometry, offset); } polylineVolumeGeometry._ellipsoid = Ellipsoid.clone(polylineVolumeGeometry._ellipsoid); return PolylineVolumeGeometry.createGeometry(polylineVolumeGeometry); diff --git a/Source/Workers/createPolylineVolumeOutlineGeometry.js b/Source/Workers/createPolylineVolumeOutlineGeometry.js index 572d10dcfa60..5ef898e172c2 100644 --- a/Source/Workers/createPolylineVolumeOutlineGeometry.js +++ b/Source/Workers/createPolylineVolumeOutlineGeometry.js @@ -9,9 +9,9 @@ define([ PolylineVolumeOutlineGeometry) { "use strict"; - function createPolylineVolumeOutlineGeometry(polylineVolumeOutlineGeometry) { - if (defined(polylineVolumeOutlineGeometry.buffer)) { - polylineVolumeOutlineGeometry = PolylineVolumeOutlineGeometry.unpack(polylineVolumeOutlineGeometry); + function createPolylineVolumeOutlineGeometry(polylineVolumeOutlineGeometry, offset) { + if (defined(offset)) { + polylineVolumeOutlineGeometry = PolylineVolumeOutlineGeometry.unpack(polylineVolumeOutlineGeometry, offset); } polylineVolumeOutlineGeometry._ellipsoid = Ellipsoid.clone(polylineVolumeOutlineGeometry._ellipsoid); return PolylineVolumeOutlineGeometry.createGeometry(polylineVolumeOutlineGeometry); diff --git a/Source/Workers/createRectangleGeometry.js b/Source/Workers/createRectangleGeometry.js index 64b63491b38e..13d87bffe571 100644 --- a/Source/Workers/createRectangleGeometry.js +++ b/Source/Workers/createRectangleGeometry.js @@ -11,9 +11,9 @@ define([ RectangleGeometry) { "use strict"; - function createRectangleGeometry(rectangleGeometry) { - if (defined(rectangleGeometry.buffer)) { - rectangleGeometry = RectangleGeometry.unpack(rectangleGeometry); + function createRectangleGeometry(rectangleGeometry, offset) { + if (defined(offset)) { + rectangleGeometry = RectangleGeometry.unpack(rectangleGeometry, offset); } rectangleGeometry._ellipsoid = Ellipsoid.clone(rectangleGeometry._ellipsoid); rectangleGeometry._rectangle = Rectangle.clone(rectangleGeometry._rectangle); diff --git a/Source/Workers/createRectangleOutlineGeometry.js b/Source/Workers/createRectangleOutlineGeometry.js index 1f9a69442359..afa790575283 100644 --- a/Source/Workers/createRectangleOutlineGeometry.js +++ b/Source/Workers/createRectangleOutlineGeometry.js @@ -11,9 +11,9 @@ define([ RectangleOutlineGeometry) { "use strict"; - function createRectangleOutlineGeometry(rectangleGeometry) { - if (defined(rectangleGeometry.buffer)) { - rectangleGeometry = RectangleOutlineGeometry.unpack(rectangleGeometry); + function createRectangleOutlineGeometry(rectangleGeometry, offset) { + if (defined(offset)) { + rectangleGeometry = RectangleOutlineGeometry.unpack(rectangleGeometry, offset); } rectangleGeometry._ellipsoid = Ellipsoid.clone(rectangleGeometry._ellipsoid); rectangleGeometry._rectangle = Rectangle.clone(rectangleGeometry._rectangle); diff --git a/Source/Workers/createSimplePolylineGeometry.js b/Source/Workers/createSimplePolylineGeometry.js index 5242320d39c7..6ab03361b05e 100644 --- a/Source/Workers/createSimplePolylineGeometry.js +++ b/Source/Workers/createSimplePolylineGeometry.js @@ -9,9 +9,9 @@ define([ SimplePolylineGeometry) { "use strict"; - function createSimplePolylineGeometry(simplePolylineGeometry) { - if (defined(simplePolylineGeometry.buffer)) { - simplePolylineGeometry = SimplePolylineGeometry.unpack(simplePolylineGeometry); + function createSimplePolylineGeometry(simplePolylineGeometry, offset) { + if (defined(offset)) { + simplePolylineGeometry = SimplePolylineGeometry.unpack(simplePolylineGeometry, offset); } simplePolylineGeometry._ellipsoid = Ellipsoid.clone(simplePolylineGeometry._ellipsoid); return SimplePolylineGeometry.createGeometry(simplePolylineGeometry); diff --git a/Source/Workers/createSphereGeometry.js b/Source/Workers/createSphereGeometry.js index d56859de87c5..db749b945e19 100644 --- a/Source/Workers/createSphereGeometry.js +++ b/Source/Workers/createSphereGeometry.js @@ -7,9 +7,9 @@ define([ SphereGeometry) { "use strict"; - return function(sphereGeometry) { - if (defined(sphereGeometry.buffer)) { - sphereGeometry = SphereGeometry.unpack(sphereGeometry); + return function(sphereGeometry, offset) { + if (defined(offset)) { + sphereGeometry = SphereGeometry.unpack(sphereGeometry, offset); } return SphereGeometry.createGeometry(sphereGeometry); }; diff --git a/Source/Workers/createSphereOutlineGeometry.js b/Source/Workers/createSphereOutlineGeometry.js index c3cf4915e415..144a2944cc2e 100644 --- a/Source/Workers/createSphereOutlineGeometry.js +++ b/Source/Workers/createSphereOutlineGeometry.js @@ -7,9 +7,9 @@ define([ SphereOutlineGeometry) { "use strict"; - return function(sphereGeometry) { - if (defined(sphereGeometry.buffer)) { - sphereGeometry = SphereOutlineGeometry.unpack(sphereGeometry); + return function(sphereGeometry, offset) { + if (defined(offset)) { + sphereGeometry = SphereOutlineGeometry.unpack(sphereGeometry, offset); } return SphereOutlineGeometry.createGeometry(sphereGeometry); }; diff --git a/Source/Workers/createWallGeometry.js b/Source/Workers/createWallGeometry.js index f38fdf01a38c..8326b64f8e5f 100644 --- a/Source/Workers/createWallGeometry.js +++ b/Source/Workers/createWallGeometry.js @@ -9,9 +9,9 @@ define([ WallGeometry) { "use strict"; - function createWallGeometry(wallGeometry) { - if (defined(wallGeometry.buffer)) { - wallGeometry = WallGeometry.unpack(wallGeometry); + function createWallGeometry(wallGeometry, offset) { + if (defined(offset)) { + wallGeometry = WallGeometry.unpack(wallGeometry, offset); } wallGeometry._ellipsoid = Ellipsoid.clone(wallGeometry._ellipsoid); return WallGeometry.createGeometry(wallGeometry); diff --git a/Source/Workers/createWallOutlineGeometry.js b/Source/Workers/createWallOutlineGeometry.js index 835cbae82366..fd555460b045 100644 --- a/Source/Workers/createWallOutlineGeometry.js +++ b/Source/Workers/createWallOutlineGeometry.js @@ -9,9 +9,9 @@ define([ WallOutlineGeometry) { "use strict"; - function createWallOutlineGeometry(wallGeometry) { - if (defined(wallGeometry.buffer)) { - wallGeometry = WallOutlineGeometry.unpack(wallGeometry); + function createWallOutlineGeometry(wallGeometry, offset) { + if (defined(offset)) { + wallGeometry = WallOutlineGeometry.unpack(wallGeometry, offset); } wallGeometry._ellipsoid = Ellipsoid.clone(wallGeometry._ellipsoid); return WallOutlineGeometry.createGeometry(wallGeometry);