import { WebGLConstants } from "../../Source/Cesium.js"; import { WindingOrder } from "../../Source/Cesium.js"; import { ContextLimits } from "../../Source/Cesium.js"; import { RenderState } from "../../Source/Cesium.js"; import createContext from "../createContext.js"; describe( "Renderer/RenderState", function () { var context; beforeAll(function () { context = createContext(); }); afterAll(function () { context.destroyForSpecs(); }); it("creates with defaults", function () { var defaultRS = { frontFace: WindingOrder.COUNTER_CLOCKWISE, cull: { enabled: false, face: WebGLConstants.BACK, }, lineWidth: 1, polygonOffset: { enabled: false, factor: 0, units: 0, }, scissorTest: { enabled: false, rectangle: { x: 0, y: 0, width: 0, height: 0, }, }, depthRange: { near: 0, far: 1, }, depthTest: { enabled: false, func: WebGLConstants.LESS, }, colorMask: { red: true, green: true, blue: true, alpha: true, }, depthMask: true, stencilMask: ~0, blending: { enabled: false, color: { red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0, }, equationRgb: WebGLConstants.FUNC_ADD, equationAlpha: WebGLConstants.FUNC_ADD, functionSourceRgb: WebGLConstants.ONE, functionSourceAlpha: WebGLConstants.ONE, functionDestinationRgb: WebGLConstants.ZERO, functionDestinationAlpha: WebGLConstants.ZERO, }, stencilTest: { enabled: false, frontFunction: WebGLConstants.ALWAYS, backFunction: WebGLConstants.ALWAYS, reference: 0, mask: ~0, frontOperation: { fail: WebGLConstants.KEEP, zFail: WebGLConstants.KEEP, zPass: WebGLConstants.KEEP, }, backOperation: { fail: WebGLConstants.KEEP, zFail: WebGLConstants.KEEP, zPass: WebGLConstants.KEEP, }, }, sampleCoverage: { enabled: false, value: 1.0, invert: false, }, }; var rs = RenderState.fromCache(); expect(rs.frontFace).toEqual(defaultRS.frontFace); expect(rs.cull.enabled).toEqual(defaultRS.cull.enabled); expect(rs.cull.face).toEqual(defaultRS.cull.face); expect(rs.cull.lineWidth).toEqual(defaultRS.cull.lineWidth); expect(rs.polygonOffset.enabled).toEqual(defaultRS.polygonOffset.enabled); expect(rs.polygonOffset.factor).toEqual(defaultRS.polygonOffset.factor); expect(rs.polygonOffset.units).toEqual(defaultRS.polygonOffset.units); expect(rs.scissorTest.enabled).toEqual(defaultRS.scissorTest.enabled); expect(rs.scissorTest.rectangle.x).toEqual( defaultRS.scissorTest.rectangle.x ); expect(rs.scissorTest.rectangle.y).toEqual( defaultRS.scissorTest.rectangle.y ); expect(rs.scissorTest.rectangle.width).toEqual( defaultRS.scissorTest.rectangle.width ); expect(rs.scissorTest.rectangle.height).toEqual( defaultRS.scissorTest.rectangle.height ); expect(rs.depthRange.near).toEqual(defaultRS.depthRange.near); expect(rs.depthRange.far).toEqual(defaultRS.depthRange.far); expect(rs.depthTest.enabled).toEqual(defaultRS.depthTest.enabled); expect(rs.depthTest.func).toEqual(defaultRS.depthTest.func); expect(rs.colorMask.red).toEqual(defaultRS.colorMask.red); expect(rs.colorMask.green).toEqual(defaultRS.colorMask.green); expect(rs.colorMask.blue).toEqual(defaultRS.colorMask.blue); expect(rs.colorMask.alpha).toEqual(defaultRS.colorMask.alpha); expect(rs.depthMask).toEqual(defaultRS.depthMask); expect(rs.stencilMask).toEqual(defaultRS.stencilMask); expect(rs.blending.enabled).toEqual(defaultRS.blending.enabled); expect(rs.blending.color.red).toEqual(defaultRS.blending.color.red); expect(rs.blending.color.green).toEqual(defaultRS.blending.color.green); expect(rs.blending.color.blue).toEqual(defaultRS.blending.color.blue); expect(rs.blending.color.alpha).toEqual(defaultRS.blending.color.alpha); expect(rs.blending.equationRgb).toEqual(defaultRS.blending.equationRgb); expect(rs.blending.equationAlpha).toEqual( defaultRS.blending.equationAlpha ); expect(rs.blending.functionSourceRgb).toEqual( defaultRS.blending.functionSourceRgb ); expect(rs.blending.functionSourceAlpha).toEqual( defaultRS.blending.functionSourceAlpha ); expect(rs.blending.functionDestinationRgb).toEqual( defaultRS.blending.functionDestinationRgb ); expect(rs.blending.functionDestinationAlpha).toEqual( defaultRS.blending.functionDestinationAlpha ); expect(rs.stencilTest.enabled).toEqual(defaultRS.stencilTest.enabled); expect(rs.stencilTest.frontFunction).toEqual( defaultRS.stencilTest.frontFunction ); expect(rs.stencilTest.backFunction).toEqual( defaultRS.stencilTest.backFunction ); expect(rs.stencilTest.reference).toEqual(defaultRS.stencilTest.reference); expect(rs.stencilTest.mask).toEqual(defaultRS.stencilTest.mask); expect(rs.stencilTest.frontOperation.fail).toEqual( defaultRS.stencilTest.frontOperation.fail ); expect(rs.stencilTest.frontOperation.zFail).toEqual( defaultRS.stencilTest.frontOperation.zFail ); expect(rs.stencilTest.frontOperation.zPass).toEqual( defaultRS.stencilTest.frontOperation.zPass ); expect(rs.stencilTest.backOperation.fail).toEqual( defaultRS.stencilTest.backOperation.fail ); expect(rs.stencilTest.backOperation.zFail).toEqual( defaultRS.stencilTest.backOperation.zFail ); expect(rs.stencilTest.backOperation.zPass).toEqual( defaultRS.stencilTest.backOperation.zPass ); expect(rs.sampleCoverage.enabled).toEqual( defaultRS.sampleCoverage.enabled ); expect(rs.sampleCoverage.value).toEqual(defaultRS.sampleCoverage.value); expect(rs.sampleCoverage.invert).toEqual(defaultRS.sampleCoverage.invert); }); it("creates with all render states", function () { var r = { frontFace: WindingOrder.CLOCKWISE, cull: { enabled: true, face: WebGLConstants.FRONT, }, lineWidth: ContextLimits.maximumAliasedLineWidth, polygonOffset: { enabled: false, factor: 1, units: 1, }, scissorTest: { enabled: true, rectangle: { x: 1, y: 1, width: 2, height: 2, }, }, depthRange: { near: 0.25, far: 0.75, }, depthTest: { enabled: true, func: WebGLConstants.GREATER, }, colorMask: { red: false, green: false, blue: false, alpha: false, }, depthMask: false, stencilMask: 0, blending: { enabled: true, color: { red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0, }, equationRgb: WebGLConstants.FUNC_SUBTRACT, equationAlpha: WebGLConstants.FUNC_SUBTRACT, functionSourceRgb: WebGLConstants.ZERO, functionSourceAlpha: WebGLConstants.ZERO, functionDestinationRgb: WebGLConstants.ONE, functionDestinationAlpha: WebGLConstants.ONE, }, stencilTest: { enabled: true, frontFunction: WebGLConstants.NEVER, backFunction: WebGLConstants.NEVER, reference: 1, mask: 0, frontOperation: { fail: WebGLConstants.REPLACE, zFail: WebGLConstants.REPLACE, zPass: WebGLConstants.REPLACE, }, backOperation: { fail: WebGLConstants.REPLACE, zFail: WebGLConstants.REPLACE, zPass: WebGLConstants.REPLACE, }, }, sampleCoverage: { enabled: true, value: 0.5, invert: true, }, }; var rs = RenderState.fromCache(r); expect(rs.frontFace).toEqual(r.frontFace); expect(rs.cull.enabled).toEqual(r.cull.enabled); expect(rs.cull.face).toEqual(r.cull.face); expect(rs.cull.lineWidth).toEqual(r.cull.lineWidth); expect(rs.polygonOffset.enabled).toEqual(r.polygonOffset.enabled); expect(rs.polygonOffset.factor).toEqual(r.polygonOffset.factor); expect(rs.polygonOffset.units).toEqual(r.polygonOffset.units); expect(rs.scissorTest.enabled).toEqual(r.scissorTest.enabled); expect(rs.scissorTest.rectangle.x).toEqual(r.scissorTest.rectangle.x); expect(rs.scissorTest.rectangle.y).toEqual(r.scissorTest.rectangle.y); expect(rs.scissorTest.rectangle.width).toEqual( r.scissorTest.rectangle.width ); expect(rs.scissorTest.rectangle.height).toEqual( r.scissorTest.rectangle.height ); expect(rs.depthRange.near).toEqual(r.depthRange.near); expect(rs.depthRange.far).toEqual(r.depthRange.far); expect(rs.depthTest.enabled).toEqual(r.depthTest.enabled); expect(rs.depthTest.func).toEqual(r.depthTest.func); expect(rs.colorMask.red).toEqual(r.colorMask.red); expect(rs.colorMask.green).toEqual(r.colorMask.green); expect(rs.colorMask.blue).toEqual(r.colorMask.blue); expect(rs.colorMask.alpha).toEqual(r.colorMask.alpha); expect(rs.depthMask).toEqual(r.depthMask); expect(rs.stencilMask).toEqual(r.stencilMask); expect(rs.blending.enabled).toEqual(r.blending.enabled); expect(rs.blending.color.red).toEqual(r.blending.color.red); expect(rs.blending.color.green).toEqual(r.blending.color.green); expect(rs.blending.color.blue).toEqual(r.blending.color.blue); expect(rs.blending.color.alpha).toEqual(r.blending.color.alpha); expect(rs.blending.equationRgb).toEqual(r.blending.equationRgb); expect(rs.blending.equationAlpha).toEqual(r.blending.equationAlpha); expect(rs.blending.functionSourceRgb).toEqual( r.blending.functionSourceRgb ); expect(rs.blending.functionSourceAlpha).toEqual( r.blending.functionSourceAlpha ); expect(rs.blending.functionDestinationRgb).toEqual( r.blending.functionDestinationRgb ); expect(rs.blending.functionDestinationAlpha).toEqual( r.blending.functionDestinationAlpha ); expect(rs.stencilTest.enabled).toEqual(r.stencilTest.enabled); expect(rs.stencilTest.frontFunction).toEqual(r.stencilTest.frontFunction); expect(rs.stencilTest.backFunction).toEqual(r.stencilTest.backFunction); expect(rs.stencilTest.reference).toEqual(r.stencilTest.reference); expect(rs.stencilTest.mask).toEqual(r.stencilTest.mask); expect(rs.stencilTest.frontOperation.fail).toEqual( r.stencilTest.frontOperation.fail ); expect(rs.stencilTest.frontOperation.zFail).toEqual( r.stencilTest.frontOperation.zFail ); expect(rs.stencilTest.frontOperation.zPass).toEqual( r.stencilTest.frontOperation.zPass ); expect(rs.stencilTest.backOperation.fail).toEqual( r.stencilTest.backOperation.fail ); expect(rs.stencilTest.backOperation.zFail).toEqual( r.stencilTest.backOperation.zFail ); expect(rs.stencilTest.backOperation.zPass).toEqual( r.stencilTest.backOperation.zPass ); expect(rs.sampleCoverage.enabled).toEqual(r.sampleCoverage.enabled); expect(rs.sampleCoverage.value).toEqual(r.sampleCoverage.value); expect(rs.sampleCoverage.invert).toEqual(r.sampleCoverage.invert); }); it("creates with some render states", function () { var r = { frontFace: WindingOrder.CLOCKWISE, depthRange: { near: 0.25, far: 0.75, }, }; var rs = RenderState.fromCache(r); expect(rs.frontFace).toEqual(r.frontFace); expect(rs.depthRange.near).toEqual(r.depthRange.near); expect(rs.depthRange.far).toEqual(r.depthRange.far); var defaultRS = RenderState.fromCache(); expect(rs.cull.enabled).toEqual(defaultRS.cull.enabled); expect(rs.cull.face).toEqual(defaultRS.cull.face); expect(rs.cull.lineWidth).toEqual(defaultRS.cull.lineWidth); expect(rs.polygonOffset.enabled).toEqual(defaultRS.polygonOffset.enabled); expect(rs.polygonOffset.factor).toEqual(defaultRS.polygonOffset.factor); expect(rs.polygonOffset.units).toEqual(defaultRS.polygonOffset.units); expect(rs.scissorTest.enabled).toEqual(defaultRS.scissorTest.enabled); expect(rs.scissorTest.rectangle.x).toEqual( defaultRS.scissorTest.rectangle.x ); expect(rs.scissorTest.rectangle.y).toEqual( defaultRS.scissorTest.rectangle.y ); expect(rs.scissorTest.rectangle.width).toEqual( defaultRS.scissorTest.rectangle.width ); expect(rs.scissorTest.rectangle.height).toEqual( defaultRS.scissorTest.rectangle.height ); expect(rs.depthTest.enabled).toEqual(defaultRS.depthTest.enabled); expect(rs.depthTest.func).toEqual(defaultRS.depthTest.func); expect(rs.colorMask.red).toEqual(defaultRS.colorMask.red); expect(rs.colorMask.green).toEqual(defaultRS.colorMask.green); expect(rs.colorMask.blue).toEqual(defaultRS.colorMask.blue); expect(rs.colorMask.alpha).toEqual(defaultRS.colorMask.alpha); expect(rs.depthMask).toEqual(defaultRS.depthMask); expect(rs.stencilMask).toEqual(defaultRS.stencilMask); expect(rs.blending.enabled).toEqual(defaultRS.blending.enabled); expect(rs.blending.color.red).toEqual(defaultRS.blending.color.red); expect(rs.blending.color.green).toEqual(defaultRS.blending.color.green); expect(rs.blending.color.blue).toEqual(defaultRS.blending.color.blue); expect(rs.blending.color.alpha).toEqual(defaultRS.blending.color.alpha); expect(rs.blending.equationRgb).toEqual(defaultRS.blending.equationRgb); expect(rs.blending.equationAlpha).toEqual( defaultRS.blending.equationAlpha ); expect(rs.blending.functionSourceRgb).toEqual( defaultRS.blending.functionSourceRgb ); expect(rs.blending.functionSourceAlpha).toEqual( defaultRS.blending.functionSourceAlpha ); expect(rs.blending.functionDestinationRgb).toEqual( defaultRS.blending.functionDestinationRgb ); expect(rs.blending.functionDestinationAlpha).toEqual( defaultRS.blending.functionDestinationAlpha ); expect(rs.stencilTest.enabled).toEqual(defaultRS.stencilTest.enabled); expect(rs.stencilTest.frontFunction).toEqual( defaultRS.stencilTest.frontFunction ); expect(rs.stencilTest.backFunction).toEqual( defaultRS.stencilTest.backFunction ); expect(rs.stencilTest.reference).toEqual(defaultRS.stencilTest.reference); expect(rs.stencilTest.mask).toEqual(defaultRS.stencilTest.mask); expect(rs.stencilTest.frontOperation.fail).toEqual( defaultRS.stencilTest.frontOperation.fail ); expect(rs.stencilTest.frontOperation.zFail).toEqual( defaultRS.stencilTest.frontOperation.zFail ); expect(rs.stencilTest.frontOperation.zPass).toEqual( defaultRS.stencilTest.frontOperation.zPass ); expect(rs.stencilTest.backOperation.fail).toEqual( defaultRS.stencilTest.backOperation.fail ); expect(rs.stencilTest.backOperation.zFail).toEqual( defaultRS.stencilTest.backOperation.zFail ); expect(rs.stencilTest.backOperation.zPass).toEqual( defaultRS.stencilTest.backOperation.zPass ); expect(rs.sampleCoverage.enabled).toEqual( defaultRS.sampleCoverage.enabled ); expect(rs.sampleCoverage.value).toEqual(defaultRS.sampleCoverage.value); expect(rs.sampleCoverage.invert).toEqual(defaultRS.sampleCoverage.invert); }); it("caches render states", function () { var rs = RenderState.fromCache(); var rs2 = RenderState.fromCache(); // rs3 is still the same state as rs and rs2, but with a partial definition var rs3 = RenderState.fromCache({ depthTest: { enabled: false, func: WebGLConstants.LESS, }, }); // rs4 is a cache miss since it has a different depthTest var rs4 = RenderState.fromCache({ depthTest: { enabled: true, func: WebGLConstants.NEVER, }, }); expect(rs2).toBe(rs); expect(rs3).toBe(rs); expect(rs4).not.toBe(rs); }); it("removes from render cache", function () { RenderState.clearCache(); var cache = RenderState.getCache(); var rs = RenderState.fromCache(); var undefinedKey = JSON.stringify(undefined); var fullKey = JSON.stringify(new RenderState()); expect(cache[fullKey].referenceCount).toEqual(1); expect(cache[undefinedKey].referenceCount).toEqual(1); var rs2 = RenderState.fromCache(); expect(cache[fullKey].referenceCount).toEqual(1); expect(cache[undefinedKey].referenceCount).toEqual(2); // rs3 is still the same state as rs and rs2, but with a partial definition var param = { depthTest: { enabled: false, func: WebGLConstants.LESS, }, }; var rs3 = RenderState.fromCache(param); var paramKey = JSON.stringify(param); expect(rs2).toBe(rs); expect(rs3).toBe(rs); expect(cache[fullKey].referenceCount).toEqual(2); expect(cache[undefinedKey].referenceCount).toEqual(2); expect(cache[paramKey].referenceCount).toEqual(1); RenderState.removeFromCache(param); expect(cache[fullKey].referenceCount).toEqual(1); expect(cache[undefinedKey].referenceCount).toEqual(2); expect(cache[paramKey]).not.toBeDefined(); RenderState.removeFromCache(); RenderState.removeFromCache(); expect(cache[undefinedKey]).not.toBeDefined(); expect(cache[fullKey]).not.toBeDefined(); }); it("freezes render states", function () { var rs = RenderState.fromCache(); expect(Object.isFrozen(rs)).toBe(!window.specsUsingRelease); }); it("fails to create (frontFace)", function () { expect(function () { RenderState.fromCache({ frontFace: "invalid value", }); }).toThrowDeveloperError(); }); it("fails to create (cull.face)", function () { expect(function () { RenderState.fromCache({ cull: { face: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (small lineWidth)", function () { expect(function () { RenderState.fromCache({ lineWidth: ContextLimits.minimumAliasedLineWidth - 1, }); }).toThrowDeveloperError(); }); it("fails to create (large lineWidth)", function () { expect(function () { RenderState.fromCache({ lineWidth: ContextLimits.maximumAliasedLineWidth + 1, }); }).toThrowDeveloperError(); }); it("fails to create (negative scissorTest.rectangle.width)", function () { expect(function () { RenderState.fromCache({ scissorTest: { rectangle: { x: 0, y: 0, width: -1, height: 0, }, }, }); }).toThrowDeveloperError(); }); it("fails to create (negative scissorTest.rectangle.height)", function () { expect(function () { RenderState.fromCache({ scissorTest: { rectangle: { x: 0, y: 0, width: 0, height: -1, }, }, }); }).toThrowDeveloperError(); }); it("fails to create (near > far)", function () { expect(function () { RenderState.fromCache({ depthRange: { near: 0.75, far: 0.25, }, }); }).toThrowDeveloperError(); }); it("fails to create (near < 0)", function () { expect(function () { RenderState.fromCache({ depthRange: { near: -1, }, }); }).toThrowDeveloperError(); }); it("fails to create (far > 1)", function () { expect(function () { RenderState.fromCache({ depthRange: { far: 2, }, }); }).toThrowDeveloperError(); }); it("fails to create (depthTest.func)", function () { expect(function () { RenderState.fromCache({ depthTest: { func: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (blending.color < 0)", function () { expect(function () { RenderState.fromCache({ blending: { color: { red: -1.0, green: 0.0, blue: 0.0, alpha: 0.0, }, }, }); }).toThrowDeveloperError(); }); it("fails to create (blending.color > 1)", function () { expect(function () { RenderState.fromCache({ blending: { color: { red: 0.0, green: 0.0, blue: 0.0, alpha: 2.0, }, }, }); }).toThrowDeveloperError(); }); it("fails to create (blend.equationRgb)", function () { expect(function () { RenderState.fromCache({ blending: { equationRgb: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (blend.equationAlpha)", function () { expect(function () { RenderState.fromCache({ blending: { equationAlpha: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (blend.functionSourceRgb)", function () { expect(function () { RenderState.fromCache({ blending: { functionSourceRgb: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (blend.functionSourceAlpha)", function () { expect(function () { RenderState.fromCache({ blending: { functionSourceAlpha: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (blend.functionDestinationRgb)", function () { expect(function () { RenderState.fromCache({ blending: { functionDestinationRgb: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (blend.functionDestinationAlpha)", function () { expect(function () { RenderState.fromCache({ blending: { functionDestinationAlpha: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.frontFunction)", function () { expect(function () { RenderState.fromCache({ stencilTest: { frontFunction: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.backFunction)", function () { expect(function () { RenderState.fromCache({ stencilTest: { backFunction: "invalid value", }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.frontOperation.fail)", function () { expect(function () { RenderState.fromCache({ stencilTest: { frontOperation: { fail: "invalid value", }, }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.frontOperation.zFail)", function () { expect(function () { RenderState.fromCache({ stencilTest: { frontOperation: { zFail: "invalid value", }, }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.frontOperation.zPass)", function () { expect(function () { RenderState.fromCache({ stencilTest: { frontOperation: { zPass: "invalid value", }, }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.backOperation.fail)", function () { expect(function () { RenderState.fromCache({ stencilTest: { backOperation: { fail: "invalid value", }, }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.backOperation.zFail)", function () { expect(function () { RenderState.fromCache({ stencilTest: { backOperation: { zFail: "invalid value", }, }, }); }).toThrowDeveloperError(); }); it("fails to create (stencilTest.backOperation.zPass)", function () { expect(function () { RenderState.fromCache({ stencilTest: { backOperation: { zPass: "invalid value", }, }, }); }).toThrowDeveloperError(); }); it("fails to get state without renderState", function () { expect(function () { RenderState.getState(undefined); }).toThrowDeveloperError(); }); it("clones", function () { var r = { frontFace: WindingOrder.CLOCKWISE, cull: { enabled: true, face: WebGLConstants.FRONT, }, lineWidth: ContextLimits.maximumAliasedLineWidth, polygonOffset: { enabled: false, factor: 1, units: 1, }, scissorTest: { enabled: true, rectangle: { x: 1, y: 1, width: 2, height: 2, }, }, depthRange: { near: 0.25, far: 0.75, }, depthTest: { enabled: true, func: WebGLConstants.GREATER, }, colorMask: { red: false, green: false, blue: false, alpha: false, }, depthMask: false, stencilMask: 0, blending: { enabled: true, color: { red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0, }, equationRgb: WebGLConstants.FUNC_SUBTRACT, equationAlpha: WebGLConstants.FUNC_SUBTRACT, functionSourceRgb: WebGLConstants.ZERO, functionSourceAlpha: WebGLConstants.ZERO, functionDestinationRgb: WebGLConstants.ONE, functionDestinationAlpha: WebGLConstants.ONE, }, stencilTest: { enabled: true, frontFunction: WebGLConstants.NEVER, backFunction: WebGLConstants.NEVER, reference: 1, mask: 0, frontOperation: { fail: WebGLConstants.REPLACE, zFail: WebGLConstants.REPLACE, zPass: WebGLConstants.REPLACE, }, backOperation: { fail: WebGLConstants.REPLACE, zFail: WebGLConstants.REPLACE, zPass: WebGLConstants.REPLACE, }, }, sampleCoverage: { enabled: true, value: 0.5, invert: true, }, }; var rs = RenderState.fromCache(RenderState.getState(r)); expect(rs.frontFace).toEqual(r.frontFace); expect(rs.cull.enabled).toEqual(r.cull.enabled); expect(rs.cull.face).toEqual(r.cull.face); expect(rs.cull.lineWidth).toEqual(r.cull.lineWidth); expect(rs.polygonOffset.enabled).toEqual(r.polygonOffset.enabled); expect(rs.polygonOffset.factor).toEqual(r.polygonOffset.factor); expect(rs.polygonOffset.units).toEqual(r.polygonOffset.units); expect(rs.scissorTest.enabled).toEqual(r.scissorTest.enabled); expect(rs.scissorTest.rectangle.x).toEqual(r.scissorTest.rectangle.x); expect(rs.scissorTest.rectangle.y).toEqual(r.scissorTest.rectangle.y); expect(rs.scissorTest.rectangle.width).toEqual( r.scissorTest.rectangle.width ); expect(rs.scissorTest.rectangle.height).toEqual( r.scissorTest.rectangle.height ); expect(rs.depthRange.near).toEqual(r.depthRange.near); expect(rs.depthRange.far).toEqual(r.depthRange.far); expect(rs.depthTest.enabled).toEqual(r.depthTest.enabled); expect(rs.depthTest.func).toEqual(r.depthTest.func); expect(rs.colorMask.red).toEqual(r.colorMask.red); expect(rs.colorMask.green).toEqual(r.colorMask.green); expect(rs.colorMask.blue).toEqual(r.colorMask.blue); expect(rs.colorMask.alpha).toEqual(r.colorMask.alpha); expect(rs.depthMask).toEqual(r.depthMask); expect(rs.stencilMask).toEqual(r.stencilMask); expect(rs.blending.enabled).toEqual(r.blending.enabled); expect(rs.blending.color.red).toEqual(r.blending.color.red); expect(rs.blending.color.green).toEqual(r.blending.color.green); expect(rs.blending.color.blue).toEqual(r.blending.color.blue); expect(rs.blending.color.alpha).toEqual(r.blending.color.alpha); expect(rs.blending.equationRgb).toEqual(r.blending.equationRgb); expect(rs.blending.equationAlpha).toEqual(r.blending.equationAlpha); expect(rs.blending.functionSourceRgb).toEqual( r.blending.functionSourceRgb ); expect(rs.blending.functionSourceAlpha).toEqual( r.blending.functionSourceAlpha ); expect(rs.blending.functionDestinationRgb).toEqual( r.blending.functionDestinationRgb ); expect(rs.blending.functionDestinationAlpha).toEqual( r.blending.functionDestinationAlpha ); expect(rs.stencilTest.enabled).toEqual(r.stencilTest.enabled); expect(rs.stencilTest.frontFunction).toEqual(r.stencilTest.frontFunction); expect(rs.stencilTest.backFunction).toEqual(r.stencilTest.backFunction); expect(rs.stencilTest.reference).toEqual(r.stencilTest.reference); expect(rs.stencilTest.mask).toEqual(r.stencilTest.mask); expect(rs.stencilTest.frontOperation.fail).toEqual( r.stencilTest.frontOperation.fail ); expect(rs.stencilTest.frontOperation.zFail).toEqual( r.stencilTest.frontOperation.zFail ); expect(rs.stencilTest.frontOperation.zPass).toEqual( r.stencilTest.frontOperation.zPass ); expect(rs.stencilTest.backOperation.fail).toEqual( r.stencilTest.backOperation.fail ); expect(rs.stencilTest.backOperation.zFail).toEqual( r.stencilTest.backOperation.zFail ); expect(rs.stencilTest.backOperation.zPass).toEqual( r.stencilTest.backOperation.zPass ); expect(rs.sampleCoverage.enabled).toEqual(r.sampleCoverage.enabled); expect(rs.sampleCoverage.value).toEqual(r.sampleCoverage.value); expect(rs.sampleCoverage.invert).toEqual(r.sampleCoverage.invert); }); }, "WebGL" );