diff --git a/Specs/Scene/GroundPrimitiveSpec.js b/Specs/Scene/GroundPrimitiveSpec.js index 2aae7bef3028..08cb621a4277 100644 --- a/Specs/Scene/GroundPrimitiveSpec.js +++ b/Specs/Scene/GroundPrimitiveSpec.js @@ -1,7 +1,6 @@ /*global defineSuite*/ defineSuite([ 'Scene/GroundPrimitive', - 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Color', 'Core/ColorGeometryInstanceAttribute', @@ -19,7 +18,6 @@ defineSuite([ 'Core/RuntimeError', 'Core/ShowGeometryInstanceAttribute', 'Core/Transforms', - 'Renderer/ClearCommand', 'Scene/MaterialAppearance', 'Scene/OrthographicFrustum', 'Scene/Pass', @@ -27,15 +25,11 @@ defineSuite([ 'Scene/Primitive', 'Scene/SceneMode', 'Specs/BadGeometry', - 'Specs/createContext', 'Specs/createFrameState', 'Specs/createScene', - 'Specs/pick', - 'Specs/pollToPromise', - 'Specs/render' + 'Specs/pollToPromise' ], function( GroundPrimitive, - Cartesian2, Cartesian3, Color, ColorGeometryInstanceAttribute, @@ -53,7 +47,6 @@ defineSuite([ RuntimeError, ShowGeometryInstanceAttribute, Transforms, - ClearCommand, MaterialAppearance, OrthographicFrustum, Pass, @@ -61,19 +54,14 @@ defineSuite([ Primitive, SceneMode, BadGeometry, - createContext, createFrameState, createScene, - pick, - pollToPromise, - render) { + pollToPromise) { "use strict"; /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,fail*/ var scene; var context; - var frameState; - var us; var ellipsoid; var rectangle; @@ -82,6 +70,7 @@ defineSuite([ var rectColor; var rectangleInstance; + var primitive; var depthPrimitive; beforeAll(function() { @@ -89,8 +78,6 @@ defineSuite([ scene.fxaa = false; context = scene.context; - frameState = scene.frameState; - us = context.frameState; ellipsoid = Ellipsoid.WGS84; }); @@ -165,11 +152,12 @@ defineSuite([ afterEach(function() { scene.groundPrimitives.removeAll(); + primitive = primitive && !primitive.isDestroyed() && primitive.destroy(); depthPrimitive = depthPrimitive && !depthPrimitive.isDestroyed() && depthPrimitive.destroy(); }); it('default constructs', function() { - var primitive = new GroundPrimitive(); + primitive = new GroundPrimitive(); expect(primitive.geometryInstance).not.toBeDefined(); expect(primitive.show).toEqual(true); expect(primitive.vertexCacheOptimize).toEqual(false); @@ -185,7 +173,7 @@ defineSuite([ var geometryInstance = {}; var appearance = {}; - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : geometryInstance, show : false, vertexCacheOptimize : true, @@ -213,7 +201,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, releaseGeometryInstances : true, asynchronous : false @@ -230,7 +218,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, releaseGeometryInstances : false, asynchronous : false @@ -247,7 +235,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, releaseGeometryInstances : false, asynchronous : false @@ -266,17 +254,17 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : undefined, appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); + var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - primitive = primitive && primitive.destroy(); }); it('does not render when show is false', function() { @@ -284,7 +272,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -302,8 +290,6 @@ defineSuite([ primitive.show = false; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - primitive = primitive && primitive.destroy(); }); it('does not render other than for the color or pick pass', function() { @@ -311,7 +297,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -323,11 +309,6 @@ defineSuite([ var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - frameState.passes.render = true; - frameState.passes.pick = false; - - primitive = primitive && primitive.destroy(); }); function verifyGroundPrimitiveRender(primitive, color) { @@ -335,7 +316,7 @@ defineSuite([ scene.groundPrimitives.add(depthPrimitive); var pixels = scene.renderForSpecs(); - expect(pixels).not.toEqual([0, 0, 0, 0]); + expect(pixels).not.toEqual([0, 0, 0, 255]); expect(pixels[0]).toEqual(0); scene.groundPrimitives.add(primitive); @@ -348,7 +329,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -361,7 +342,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -375,7 +356,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -389,11 +370,13 @@ defineSuite([ return; } - scene.groundPrimitives.add(new Primitive({ + primitive = new GroundPrimitive({ geometryInstances : rectangleInstance, asynchronous : false, debugShowBoundingVolume : true - })); + }); + + scene.groundPrimitives.add(primitive); scene.camera.viewRectangle(rectangle); var pixels = scene.renderForSpecs(); expect(pixels[1]).toBeGreaterThanOrEqualTo(0); @@ -407,7 +390,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -423,7 +406,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -449,7 +432,7 @@ defineSuite([ rectangleInstance.attributes.show = new ShowGeometryInstanceAttribute(true); - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -472,7 +455,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -488,7 +471,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -505,14 +488,14 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); verifyGroundPrimitiveRender(primitive, rectColor); - var pickObject = scene.pick(new Cartesian2(0, 0)); + var pickObject = scene.pickForSpecs(); expect(pickObject.id).toEqual('rectangle'); }); @@ -521,7 +504,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, allowPicking : false, asynchronous : false @@ -529,7 +512,7 @@ defineSuite([ verifyGroundPrimitiveRender(primitive, rectColor); - var pickObject = scene.pick(new Cartesian2(0, 0)); + var pickObject = scene.pickForSpecs(); expect(pickObject).not.toBeDefined(); }); @@ -538,7 +521,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : new GeometryInstance({ geometry : PolygonGeometry.fromPositions({ positions : [] @@ -547,7 +530,7 @@ defineSuite([ compressVertices : false }); - frameState = createFrameState(); + var frameState = createFrameState(); return pollToPromise(function() { if (frameState.afterRender.length > 0) { @@ -560,7 +543,6 @@ defineSuite([ return primitive.readyPromise.then(function(arg) { expect(arg).toBe(primitive); expect(primitive.ready).toBe(true); - primitive = primitive && primitive.destroy(); }); }); }); @@ -570,7 +552,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : new GeometryInstance({ geometry : PolygonGeometry.fromPositions({ positions : [] @@ -580,7 +562,7 @@ defineSuite([ compressVertices : false }); - frameState = createFrameState(); + var frameState = createFrameState(); return pollToPromise(function() { if (frameState.afterRender.length > 0) { @@ -593,7 +575,6 @@ defineSuite([ return primitive.readyPromise.then(function(arg) { expect(arg).toBe(primitive); expect(primitive.ready).toBe(true); - primitive = primitive && primitive.destroy(); }); }); }); @@ -603,7 +584,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -622,13 +603,13 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : true, allowPicking : false }); - frameState = createFrameState(); + var frameState = createFrameState(); return pollToPromise(function() { primitive.update(context, frameState, []); @@ -641,8 +622,6 @@ defineSuite([ expect(function() { attributes.color = undefined; }).toThrowDeveloperError(); - - primitive = primitive && primitive.destroy(); }); }); @@ -651,7 +630,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -664,7 +643,7 @@ defineSuite([ }); it('getGeometryInstanceAttributes throws if update was not called', function() { - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -672,8 +651,6 @@ defineSuite([ expect(function() { primitive.getGeometryInstanceAttributes('rectangle'); }).toThrowDeveloperError(); - - primitive = primitive && primitive.destroy(); }); it('getGeometryInstanceAttributes returns undefined if id does not exist', function() { @@ -681,7 +658,7 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance, asynchronous : false }); @@ -692,10 +669,10 @@ defineSuite([ }); it('isDestroyed', function() { - var p = new GroundPrimitive(); - expect(p.isDestroyed()).toEqual(false); - p.destroy(); - expect(p.isDestroyed()).toEqual(true); + primitive = new GroundPrimitive(); + expect(primitive.isDestroyed()).toEqual(false); + primitive.destroy(); + expect(primitive.isDestroyed()).toEqual(true); }); it('renders when using asynchronous pipeline', function() { @@ -703,11 +680,11 @@ defineSuite([ return; } - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance }); - frameState = createFrameState(); + var frameState = createFrameState(); return pollToPromise(function() { primitive.update(context, frameState, []); @@ -721,11 +698,11 @@ defineSuite([ }); it('destroy before asynchonous pipeline is complete', function() { - var primitive = new GroundPrimitive({ + primitive = new GroundPrimitive({ geometryInstance : rectangleInstance }); - frameState = createFrameState(); + var frameState = createFrameState(); primitive.update(context, frameState, []); primitive.destroy(); diff --git a/Specs/Scene/PrimitiveCollectionSpec.js b/Specs/Scene/PrimitiveCollectionSpec.js index 312fbd9240fe..219e2a4ac767 100644 --- a/Specs/Scene/PrimitiveCollectionSpec.js +++ b/Specs/Scene/PrimitiveCollectionSpec.js @@ -2,68 +2,63 @@ defineSuite([ 'Scene/PrimitiveCollection', 'Core/Cartesian3', + 'Core/ColorGeometryInstanceAttribute', 'Core/defaultValue', - 'Core/Ellipsoid', + 'Core/defined', + 'Core/GeometryInstance', 'Core/Math', - 'Renderer/ClearCommand', + 'Core/Matrix4', + 'Core/Rectangle', + 'Core/RectangleGeometry', 'Scene/HorizontalOrigin', 'Scene/LabelCollection', - 'Scene/Polygon', + 'Scene/PerInstanceColorAppearance', + 'Scene/Primitive', 'Scene/VerticalOrigin', - 'Specs/createCamera', - 'Specs/createContext', - 'Specs/createFrameState', - 'Specs/pick', - 'Specs/render' + 'Specs/createScene' ], function( PrimitiveCollection, Cartesian3, + ColorGeometryInstanceAttribute, defaultValue, - Ellipsoid, + defined, + GeometryInstance, CesiumMath, - ClearCommand, + Matrix4, + Rectangle, + RectangleGeometry, HorizontalOrigin, LabelCollection, - Polygon, + PerInstanceColorAppearance, + Primitive, VerticalOrigin, - createCamera, - createContext, - createFrameState, - pick, - render) { + createScene) { "use strict"; /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn*/ + var scene; var context; + var rectangle; var primitives; - var frameState; - var us; - var camera; beforeAll(function() { - context = createContext(); - frameState = createFrameState(); + scene = createScene(); + scene.primitives.destroyPrimitives = false; + context = scene.context; + rectangle = Rectangle.fromDegrees(-80.0, 20.0, -70.0, 30.0); }); afterAll(function() { - context.destroyForSpecs(); + scene.destroyForSpecs(); }); beforeEach(function() { primitives = new PrimitiveCollection(); - - camera = createCamera(); - camera.position = new Cartesian3(1.02, 0.0, 0.0); - camera.up = Cartesian3.clone(Cartesian3.UNIT_Z); - camera.direction = Cartesian3.negate(Cartesian3.normalize(camera.position, new Cartesian3()), new Cartesian3()); - - us = context.uniformState; - us.update(context, createFrameState(camera)); }); afterEach(function() { - primitives = primitives && primitives.destroy(); - us = undefined; + scene.primitives.removeAll(); + primitives = primitives && !primitives.isDestroyed() && primitives.destroy(); }); function createLabels(position) { @@ -82,20 +77,35 @@ defineSuite([ return labels; } - function createPolygon(degree, ellipsoid) { - degree = defaultValue(degree, 50.0); - ellipsoid = defaultValue(ellipsoid, Ellipsoid.UNIT_SPHERE); - var polygon = new Polygon(); - polygon.ellipsoid = ellipsoid; - polygon.granularity = CesiumMath.toRadians(20.0); - polygon.positions = Cartesian3.fromDegreesArray([ - -degree, -degree, - degree, -degree, - degree, degree, - -degree, degree - ], ellipsoid); - polygon.asynchronous = false; - return polygon; + function createRectangle() { + return new Primitive({ + geometryInstances : new GeometryInstance({ + geometry : new RectangleGeometry({ + rectangle : rectangle + }), + attributes : { + color : new ColorGeometryInstanceAttribute(1.0, 1.0, 0.0, 0.5) + } + }), + appearance : new PerInstanceColorAppearance(), + releaseGeometryInstances : true, + asynchronous : false + }); + } + + function verifyPrimitivesRender(primitives, color) { + scene.primitives.removeAll(); + scene.camera.viewRectangle(rectangle); + + expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); + + scene.primitives.add(primitives); + + if (defined(color)) { + expect(scene.renderForSpecs()).toEqual(color); + } else { + expect(scene.renderForSpecs()).not.toEqual([0, 0, 0, 255]); + } } it('constructs with options', function() { @@ -242,6 +252,8 @@ defineSuite([ expect(otherPrimitives.contains(p)).toEqual(false); expect(otherPrimitives.remove(p)).toEqual(false); + + otherPrimitives.destroy(); }); it('gets default destroyPrimitives', function() { @@ -249,67 +261,46 @@ defineSuite([ }); it('renders a primitive added with add()', function() { - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - primitives.add(createLabels()); - render(context, frameState, primitives); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + verifyPrimitivesRender(primitives); }); it('does not render', function() { - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - primitives.show = false; primitives.add(createLabels()); - render(context, frameState, primitives); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); + verifyPrimitivesRender(primitives, [0, 0, 0, 255]); }); it('renders a primitive in more than one composite', function() { - var otherPrimitives = new PrimitiveCollection(); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - var p = createLabels(); primitives.add(p); - otherPrimitives.add(p); - otherPrimitives.destroyPrimitives = false; - - render(context, frameState, primitives); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - // Render using other composite - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); + var otherPrimitives = new PrimitiveCollection(); + otherPrimitives.destroyPrimitives = false; + otherPrimitives.add(p); - render(context, frameState, otherPrimitives); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + verifyPrimitivesRender(primitives); + verifyPrimitivesRender(otherPrimitives); otherPrimitives.destroy(); }); it('renders child composites', function() { - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - var children = new PrimitiveCollection(); children.add(createLabels()); primitives.add(children); - render(context, frameState, primitives); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + verifyPrimitivesRender(primitives); }); it('picks a primitive added with add()', function() { var labels = createLabels(); var l = labels.get(0); - primitives.add(labels); - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(l); }); @@ -319,7 +310,9 @@ defineSuite([ primitives.show = false; primitives.add(labels); - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives, [0, 0, 0, 255]); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject).not.toBeDefined(); }); @@ -331,137 +324,157 @@ defineSuite([ children.add(labels); primitives.add(children); - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(l); }); it('picks a primitive added with render order (0)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p1); }); it('picks a primitive added with render order (1)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p1); primitives.add(p0); - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p0); }); it('picks a primitive added with raise (0)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.raise(p1); // Already on top - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p1); }); it('picks a primitive added with raise (1)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.raise(p0); // Moved to top - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p0); }); it('picks a primitive added with raiseToTop (0)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.raiseToTop(p1); // Already on top - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p1); }); it('picks a primitive added with raiseToTop (1)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.raiseToTop(p0); // Moved to top - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p0); }); it('picks a primitive added with lower (0)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.lower(p1); // Moved back - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p0); }); it('picks a primitive added with lower (1)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.lower(p0); // Already on bottom - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p1); }); it('picks a primitive added with lowerToBottom (0)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.lowerToBottom(p1); // Moved back - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p0); }); it('picks a primitive added with lowerToBottom (1)', function() { - var p0 = createPolygon(); - var p1 = createPolygon(); + var p0 = createRectangle(); + var p1 = createRectangle(); primitives.add(p0); primitives.add(p1); primitives.lowerToBottom(p0); // Already on bottom - var pickedObject = pick(context, frameState, primitives, 0, 0); + verifyPrimitivesRender(primitives); + + var pickedObject = scene.pickForSpecs(); expect(pickedObject.primitive).toEqual(p1); }); - it('is not destroyed when first constructed', function() { expect(primitives.isDestroyed()).toEqual(false); }); it('is destroyed after calling destroy()', function() { - var p = new PrimitiveCollection(); - p.destroy(); - expect(p.isDestroyed()).toEqual(true); + primitives.destroy(); + expect(primitives.isDestroyed()).toEqual(true); }); it('destroys its primitives', function() { @@ -470,7 +483,7 @@ defineSuite([ primitives.add(labels); expect(labels.isDestroyed()).toEqual(false); - primitives = primitives.destroy(); + primitives.destroy(); expect(labels.isDestroyed()).toEqual(true); }); @@ -484,7 +497,7 @@ defineSuite([ expect(children.isDestroyed()).toEqual(false); expect(labels.isDestroyed()).toEqual(false); - primitives = primitives.destroy(); + primitives.destroy(); expect(children.isDestroyed()).toEqual(true); expect(labels.isDestroyed()).toEqual(true); }); @@ -509,7 +522,6 @@ defineSuite([ expect(labels.isDestroyed()).toEqual(true); }); - it('does not destroy its primitives', function() { var labels = new LabelCollection(context); @@ -517,7 +529,7 @@ defineSuite([ primitives.add(labels); expect(labels.isDestroyed()).toEqual(false); - primitives = primitives.destroy(); + primitives.destroy(); expect(labels.isDestroyed()).toEqual(false); labels.destroy(); diff --git a/Specs/Scene/PrimitiveSpec.js b/Specs/Scene/PrimitiveSpec.js index ea4500b87698..bb52b1fa8e46 100644 --- a/Specs/Scene/PrimitiveSpec.js +++ b/Specs/Scene/PrimitiveSpec.js @@ -18,18 +18,14 @@ defineSuite([ 'Core/RuntimeError', 'Core/ShowGeometryInstanceAttribute', 'Core/Transforms', - 'Renderer/ClearCommand', 'Scene/MaterialAppearance', 'Scene/OrthographicFrustum', 'Scene/PerInstanceColorAppearance', 'Scene/SceneMode', 'Specs/BadGeometry', - 'Specs/createContext', 'Specs/createFrameState', 'Specs/createScene', - 'Specs/pick', - 'Specs/pollToPromise', - 'Specs/render' + 'Specs/pollToPromise' ], function( Primitive, BoxGeometry, @@ -49,24 +45,19 @@ defineSuite([ RuntimeError, ShowGeometryInstanceAttribute, Transforms, - ClearCommand, MaterialAppearance, OrthographicFrustum, PerInstanceColorAppearance, SceneMode, BadGeometry, - createContext, createFrameState, createScene, - pick, - pollToPromise, - render) { + pollToPromise) { "use strict"; /*global jasmine,describe,xdescribe,it,xit,expect,beforeEach,afterEach,beforeAll,afterAll,spyOn,fail*/ + var scene; var context; - var frameState; - var us; var ellipsoid; @@ -76,23 +67,21 @@ defineSuite([ var rectangleInstance1; var rectangleInstance2; - beforeAll(function() { - context = createContext(); - frameState = createFrameState(); - - us = context.uniformState; - us.update(context, frameState); + var primitive; + beforeAll(function() { + scene = createScene(); + scene.primitives.destroyPrimitives = false; + context = scene.context; ellipsoid = Ellipsoid.WGS84; }); afterAll(function() { - context.destroyForSpecs(); + scene.destroyForSpecs(); }); beforeEach(function() { - //Since we don't create a scene, we need to manually clean out the frameState.afterRender array before each test. - frameState.afterRender.length = 0; + scene.morphTo3D(0); rectangle1 = Rectangle.fromDegrees(-80.0, 20.0, -70.0, 30.0); rectangle2 = Rectangle.fromDegrees(70.0, 20.0, 80.0, 30.0); @@ -128,8 +117,13 @@ defineSuite([ }); }); + afterEach(function() { + scene.primitives.removeAll(); + primitive = primitive && !primitive.isDestroyed() && primitive.destroy(); + }); + it('default constructs', function() { - var primitive = new Primitive(); + primitive = new Primitive(); expect(primitive.geometryInstances).not.toBeDefined(); expect(primitive.appearance).not.toBeDefined(); expect(primitive.modelMatrix).toEqual(Matrix4.IDENTITY); @@ -149,7 +143,7 @@ defineSuite([ var appearance = {}; var modelMatrix = Matrix4.fromUniformScale(5.0); - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : geometryInstances, appearance : appearance, modelMatrix : modelMatrix, @@ -179,7 +173,7 @@ defineSuite([ }); it('releases geometry instances when releaseGeometryInstances is true', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), releaseGeometryInstances : true, @@ -187,14 +181,13 @@ defineSuite([ }); expect(primitive.geometryInstances).toBeDefined(); - primitive.update(context, frameState, []); + scene.primitives.add(primitive); + scene.renderForSpecs(); expect(primitive.geometryInstances).not.toBeDefined(); - - primitive = primitive && primitive.destroy(); }); it('does not release geometry instances when releaseGeometryInstances is false', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), releaseGeometryInstances : false, @@ -202,51 +195,48 @@ defineSuite([ }); expect(primitive.geometryInstances).toBeDefined(); - primitive.update(context, frameState, []); + scene.primitives.add(primitive); + scene.renderForSpecs(); expect(primitive.geometryInstances).toBeDefined(); - - primitive = primitive && primitive.destroy(); }); it('adds afterRender promise to frame state', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), releaseGeometryInstances : false, asynchronous : false }); - primitive.update(context, frameState, []); - expect(frameState.afterRender.length).toEqual(1); - frameState.afterRender[0](); + scene.primitives.add(primitive); + scene.renderForSpecs(); return primitive.readyPromise.then(function(param) { expect(param.ready).toBe(true); - primitive = primitive && primitive.destroy(); }); }); it('does not render when geometryInstances is an empty array', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - primitive = primitive && primitive.destroy(); }); it('does not render when show is false', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toBeGreaterThan(0); @@ -255,68 +245,58 @@ defineSuite([ primitive.show = false; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - primitive = primitive && primitive.destroy(); }); it('does not render other than for the color or pick pass', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); frameState.passes.render = false; frameState.passes.pick = false; var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - frameState.passes.render = true; - frameState.passes.pick = false; - - primitive = primitive && primitive.destroy(); }); it('does not render when scene3DOnly is true and the scene mode is SCENE2D', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); frameState.mode = SceneMode.SCENE2D; frameState.scene3DOnly = true; var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - frameState.mode = SceneMode.SCENE3D; - primitive = primitive && primitive.destroy(); }); it('does not render when scene3DOnly is true and the scene mode is COLUMBUS_VIEW', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); frameState.mode = SceneMode.COLUMBUS_VIEW; frameState.scene3DOnly = true; var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(0); - - frameState.mode = SceneMode.SCENE3D; - primitive = primitive && primitive.destroy(); }); it('renders in two passes for closed, translucent geometry', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : new GeometryInstance({ geometry : BoxGeometry.fromDimensions({ vertexFormat : PerInstanceColorAppearance.VERTEX_FORMAT, @@ -334,95 +314,58 @@ defineSuite([ asynchronous : false }); + var frameState = createFrameState(); + + // set scene3DOnly to true so that the geometry is not split due to the IDL + frameState.scene3DOnly = true; var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(2); - - primitive = primitive && primitive.destroy(); }); + function verifyPrimitiveRender(primitive, rectangle) { + scene.primitives.removeAll(); + scene.camera.viewRectangle(rectangle); + + expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); + + scene.primitives.add(primitive); + expect(scene.renderForSpecs()).not.toEqual([0, 0, 0, 255]); + } + it('renders in Columbus view when scene3DOnly is false', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.scene3DOnly = false; - frameState.mode = SceneMode.COLUMBUS_VIEW; - frameState.morphTime = SceneMode.getMorphTime(frameState.mode); - frameState.camera.update(frameState.mode); - - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - - frameState.camera.viewRectangle(rectangle2); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + scene.morphToColumbusView(0); - frameState = createFrameState(); // reset frame state - primitive = primitive && primitive.destroy(); + verifyPrimitiveRender(primitive, rectangle1); + verifyPrimitiveRender(primitive, rectangle2); }); it('renders in 2D when scene3DOnly is false', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.scene3DOnly = false; - frameState.mode = SceneMode.SCENE2D; - frameState.morphTime = SceneMode.getMorphTime(frameState.mode); - - var frustum = new OrthographicFrustum(); - frustum.right = Ellipsoid.WGS84.maximumRadius * Math.PI; - frustum.left = -frustum.right; - frustum.top = frustum.right; - frustum.bottom = -frustum.top; - frameState.camera.frustum = frustum; - frameState.camera.update(frameState.mode); - - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - - frameState.camera.viewRectangle(rectangle2); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - - frameState = createFrameState(); // reset frame state - primitive = primitive && primitive.destroy(); + scene.morphTo2D(0); + verifyPrimitiveRender(primitive, rectangle1); + verifyPrimitiveRender(primitive, rectangle2); }); it('updates model matrix for one instance in 3D', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(1); @@ -435,23 +378,22 @@ defineSuite([ primitive.update(context, frameState, commands); expect(commands.length).toEqual(1); expect(commands[0].modelMatrix).toEqual(modelMatrix); - - primitive = primitive && primitive.destroy(); }); it('updates model matrix for more than one instance in 3D with equal model matrices in 3D only scene', function() { - frameState.scene3DOnly = true; - var modelMatrix = Matrix4.fromUniformScale(2.0); rectangleInstance1.modelMatrix = modelMatrix; rectangleInstance2.modelMatrix = modelMatrix; - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); + frameState.scene3DOnly = true; + var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(1); @@ -464,15 +406,9 @@ defineSuite([ primitive.update(context, frameState, commands); expect(commands.length).toEqual(1); expect(commands[0].modelMatrix).toEqual(modelMatrix); - - primitive = primitive && primitive.destroy(); - - frameState.scene3DOnly = false; }); it('computes model matrix when given one for a single instance and for the primitive in 3D only', function() { - frameState.scene3DOnly = true; - var instanceModelMatrix = Matrix4.fromUniformScale(2.0); var dimensions = new Cartesian3(400000.0, 300000.0, 500000.0); @@ -492,7 +428,7 @@ defineSuite([ color : new ColorGeometryInstanceAttribute(1.0, 0.0, 0.0, 1.0) } }); - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : boxGeometryInstance, modelMatrix : primitiveModelMatrix, appearance : new PerInstanceColorAppearance({ @@ -504,23 +440,23 @@ defineSuite([ var expectedModelMatrix = Matrix4.multiplyTransformation(primitiveModelMatrix, instanceModelMatrix, new Matrix4()); + var frameState = createFrameState(); + frameState.scene3DOnly = true; + var commands = []; primitive.update(context, frameState, commands); expect(commands.length).toEqual(1); expect(commands[0].modelMatrix).toEqual(expectedModelMatrix); - - primitive = primitive && primitive.destroy(); - - frameState.scene3DOnly = false; }); it('update model matrix throws in Columbus view', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); frameState.mode = SceneMode.COLUMBUS_VIEW; var commands = []; @@ -535,18 +471,16 @@ defineSuite([ expect(function() { primitive.update(context, frameState, commands); }).toThrowDeveloperError(); - - frameState = createFrameState(); // reset frame state - primitive = primitive && primitive.destroy(); }); it('update model matrix throws in 2D', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); frameState.mode = SceneMode.SCENE2D; var commands = []; @@ -561,19 +495,17 @@ defineSuite([ expect(function() { primitive.update(context, frameState, []); }).toThrowDeveloperError(); - - frameState = createFrameState(); // reset frame state - primitive = primitive && primitive.destroy(); }); it('renders bounding volume with debugShowBoundingVolume', function() { - var scene = createScene(); - scene.primitives.add(new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false, debugShowBoundingVolume : true - })); + }); + + scene.primitives.add(primitive); scene.camera.viewRectangle(rectangle1); var pixels = scene.renderForSpecs(); expect(pixels[0]).not.toEqual(0); @@ -583,65 +515,30 @@ defineSuite([ }); it('transforms to world coordinates', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - - frameState.camera.viewRectangle(rectangle2); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - + verifyPrimitiveRender(primitive, rectangle1); + verifyPrimitiveRender(primitive, rectangle2); expect(primitive.modelMatrix).toEqual(Matrix4.IDENTITY); - - primitive = primitive && primitive.destroy(); }); it('does not transform to world coordinates', function() { rectangleInstance2.modelMatrix = Matrix4.clone(rectangleInstance1.modelMatrix); - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.scene3DOnly = true; - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - - frameState.camera.viewRectangle(rectangle2); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); - + scene.frameState.scene3DOnly = true; + verifyPrimitiveRender(primitive, rectangle1); + verifyPrimitiveRender(primitive, rectangle2); expect(primitive.modelMatrix).not.toEqual(Matrix4.IDENTITY); - - primitive = primitive && primitive.destroy(); + scene.frameState.scene3DOnly = true; }); it('get common per instance attributes', function() { @@ -651,12 +548,14 @@ defineSuite([ value : [0.5] }); - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); - primitive.update(context, frameState, []); + + scene.primitives.add(primitive); + scene.renderForSpecs(); var attributes = primitive.getGeometryInstanceAttributes('rectangle1'); expect(attributes.color).toBeDefined(); @@ -666,178 +565,126 @@ defineSuite([ expect(attributes.color).toBeDefined(); expect(attributes.show).toBeDefined(); expect(attributes.not_used).not.toBeDefined(); - - primitive = primitive && primitive.destroy(); }); it('modify color instance attribute', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - var pixels = context.readPixels(); - expect(pixels).not.toEqual([0, 0, 0, 0]); + scene.camera.viewRectangle(rectangle1); + scene.primitives.add(primitive); + var pixels = scene.renderForSpecs(); + expect(pixels).not.toEqual([0, 0, 0, 255]); var attributes = primitive.getGeometryInstanceAttributes('rectangle1'); expect(attributes.color).toBeDefined(); attributes.color = [255, 255, 255, 255]; - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - var newPixels = context.readPixels(); - expect(newPixels).not.toEqual([0, 0, 0, 0]); + var newPixels = scene.renderForSpecs(); + expect(newPixels).not.toEqual([0, 0, 0, 255]); expect(newPixels).not.toEqual(pixels); - - primitive = primitive && primitive.destroy(); }); it('modify show instance attribute', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + scene.primitives.add(primitive); + scene.camera.viewRectangle(rectangle1); + var pixels = scene.renderForSpecs(); + expect(pixels).not.toEqual([0, 0, 0, 255]); var attributes = primitive.getGeometryInstanceAttributes('rectangle1'); expect(attributes.show).toBeDefined(); attributes.show = [0]; - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - primitive = primitive && primitive.destroy(); + var newPixels = scene.renderForSpecs(); + expect(newPixels).toEqual([0, 0, 0, 255]); }); it('get bounding sphere from per instance attribute', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + verifyPrimitiveRender(primitive, rectangle1); var attributes = primitive.getGeometryInstanceAttributes('rectangle1'); expect(attributes.boundingSphere).toBeDefined(); - - var rectangleGeometry = RectangleGeometry.createGeometry(rectangleInstance1.geometry); - var expected = rectangleGeometry.boundingSphere; - expect(attributes.boundingSphere).toEqual(expected); - - primitive = primitive && primitive.destroy(); }); it('getGeometryInstanceAttributes returns same object each time', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); - - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - expect(context.readPixels()).not.toEqual([0, 0, 0, 0]); + verifyPrimitiveRender(primitive, rectangle1); var attributes = primitive.getGeometryInstanceAttributes('rectangle1'); var attributes2 = primitive.getGeometryInstanceAttributes('rectangle1'); expect(attributes).toBe(attributes2); - - primitive = primitive && primitive.destroy(); }); it('picking', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new PerInstanceColorAppearance(), asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); + verifyPrimitiveRender(primitive, rectangle1); - var pickObject = pick(context, frameState, primitive); + var pickObject = scene.pickForSpecs(); expect(pickObject.primitive).toEqual(primitive); expect(pickObject.id).toEqual('rectangle1'); - frameState.camera.viewRectangle(rectangle2); - us.update(context, frameState); + verifyPrimitiveRender(primitive, rectangle2); - pickObject = pick(context, frameState, primitive); + pickObject = scene.pickForSpecs(); expect(pickObject.primitive).toEqual(primitive); expect(pickObject.id).toEqual('rectangle2'); - - primitive = primitive && primitive.destroy(); }); it('does not pick when allowPicking is false', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1], appearance : new PerInstanceColorAppearance(), allowPicking : false, asynchronous : false }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); + verifyPrimitiveRender(primitive, rectangle1); - var pickObject = pick(context, frameState, primitive); + var pickObject = scene.pickForSpecs(); expect(pickObject).not.toBeDefined(); - - primitive = primitive && primitive.destroy(); }); it('does not cull when cull is false', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false, cull : false }); + var frameState = createFrameState(); var commands = []; primitive.update(context, frameState, commands); expect(commands[0].cull).toEqual(false); - - primitive = primitive && primitive.destroy(); }); it('update throws when geometry primitive types are different', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [ new GeometryInstance({ geometry : new Geometry({ @@ -868,13 +715,15 @@ defineSuite([ asynchronous : false }); + var frameState = createFrameState(); + expect(function() { primitive.update(context, frameState, []); }).toThrowDeveloperError(); }); it('failed geometry rejects promise and throws on next update', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [new GeometryInstance({ geometry : new BadGeometry() })], @@ -884,6 +733,8 @@ defineSuite([ compressVertices : false }); + var frameState = createFrameState(); + return pollToPromise(function() { if (frameState.afterRender.length > 0) { frameState.afterRender[0](); @@ -904,7 +755,7 @@ defineSuite([ }); it('internally invalid asynchronous geometry resolves promise and sets ready', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [new GeometryInstance({ geometry : PolygonGeometry.fromPositions({ positions : [] @@ -916,6 +767,8 @@ defineSuite([ compressVertices : false }); + var frameState = createFrameState(); + return pollToPromise(function() { if (frameState.afterRender.length > 0) { frameState.afterRender[0](); @@ -932,7 +785,7 @@ defineSuite([ }); it('internally invalid synchronous geometry resolves promise and sets ready', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [new GeometryInstance({ geometry : PolygonGeometry.fromPositions({ positions : [] @@ -945,6 +798,8 @@ defineSuite([ compressVertices : false }); + var frameState = createFrameState(); + return pollToPromise(function() { if (frameState.afterRender.length > 0) { frameState.afterRender[0](); @@ -961,7 +816,7 @@ defineSuite([ }); it('shader validation', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : [rectangleInstance1, rectangleInstance2], appearance : new MaterialAppearance({ materialSupport : MaterialAppearance.MaterialSupport.ALL @@ -970,36 +825,39 @@ defineSuite([ compressVertices : false }); + var frameState = createFrameState(); + expect(function() { primitive.update(context, frameState, []); }).toThrowDeveloperError(); }); it('setting per instance attribute throws when value is undefined', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); + var frameState = createFrameState(); primitive.update(context, frameState, []); var attributes = primitive.getGeometryInstanceAttributes('rectangle1'); expect(function() { attributes.color = undefined; }).toThrowDeveloperError(); - - primitive = primitive && primitive.destroy(); }); it('can disable picking when asynchronous', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : true, allowPicking : false }); + var frameState = createFrameState(); + return pollToPromise(function() { primitive.update(context, frameState, []); if (frameState.afterRender.length > 0) { @@ -1011,29 +869,26 @@ defineSuite([ expect(function() { attributes.color = undefined; }).toThrowDeveloperError(); - - primitive = primitive && primitive.destroy(); }); }); it('getGeometryInstanceAttributes throws without id', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); - primitive.update(context, frameState, []); + scene.primitives.add(primitive); + scene.renderForSpecs(); expect(function() { primitive.getGeometryInstanceAttributes(); }).toThrowDeveloperError(); - - primitive = primitive && primitive.destroy(); }); it('getGeometryInstanceAttributes throws if update was not called', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false @@ -1042,62 +897,56 @@ defineSuite([ expect(function() { primitive.getGeometryInstanceAttributes('rectangle1'); }).toThrowDeveloperError(); - - primitive = primitive && primitive.destroy(); }); it('getGeometryInstanceAttributes returns undefined if id does not exist', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance(), asynchronous : false }); - primitive.update(context, frameState, []); + scene.primitives.add(primitive); + scene.renderForSpecs(); expect(primitive.getGeometryInstanceAttributes('unknown')).not.toBeDefined(); - - primitive = primitive && primitive.destroy(); }); it('isDestroyed', function() { - var p = new Primitive(); - expect(p.isDestroyed()).toEqual(false); - p.destroy(); - expect(p.isDestroyed()).toEqual(true); + primitive = new Primitive(); + expect(primitive.isDestroyed()).toEqual(false); + primitive.destroy(); + expect(primitive.isDestroyed()).toEqual(true); }); it('renders when using asynchronous pipeline', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance({ flat : true }) }); - frameState.camera.viewRectangle(rectangle1); - us.update(context, frameState); + var frameState = createFrameState(); return pollToPromise(function() { - return render(context, frameState, primitive) > 0; + primitive.update(context, frameState, []); + if (frameState.afterRender.length > 0) { + frameState.afterRender[0](); + } + return primitive.ready; }).then(function() { - ClearCommand.ALL.execute(context); - expect(context.readPixels()).toEqual([0, 0, 0, 0]); - - render(context, frameState, primitive); - var pixels = context.readPixels(); - expect(pixels).not.toEqual([0, 0, 0, 0]); - - primitive = primitive && primitive.destroy(); + verifyPrimitiveRender(primitive, rectangle1); }); }); it('destroy before asynchonous pipeline is complete', function() { - var primitive = new Primitive({ + primitive = new Primitive({ geometryInstances : rectangleInstance1, appearance : new PerInstanceColorAppearance() }); + var frameState = createFrameState(); primitive.update(context, frameState, []); primitive.destroy(); diff --git a/Specs/createScene.js b/Specs/createScene.js index 6e5fb3f3730a..9605f7ec9e3f 100644 --- a/Specs/createScene.js +++ b/Specs/createScene.js @@ -1,5 +1,6 @@ /*global define*/ define([ + 'Core/Cartesian2', 'Core/clone', 'Core/defaultValue', 'Core/defined', @@ -8,6 +9,7 @@ define([ 'Specs/createCanvas', 'Specs/destroyCanvas' ], function( + Cartesian2, clone, defaultValue, defined, @@ -58,6 +60,10 @@ define([ return scene.context.readPixels(); }; + scene.pickForSpecs = function() { + return scene.pick(new Cartesian2(0, 0)); + }; + scene.rethrowRenderErrors = defaultValue(options.rethrowRenderErrors, true); return scene;