import { AlphaMode, clone, Color, ColorBlendMode, CPUStylingPipelineStage, ModelAlphaOptions, Pass, ShaderBuilder, StyleCommandsNeeded, _shadersCPUStylingStageFS, _shadersCPUStylingStageVS, } from "../../../Source/Cesium.js"; import ShaderBuilderTester from "../../ShaderBuilderTester.js"; describe("Scene/ModelExperimental/CPUStylingPipelineStage", function () { var defaultRenderResources = { alphaOptions: new ModelAlphaOptions(), model: { colorBlendMode: ColorBlendMode.HIGHLIGHT, colorBlendAmount: 0.5, featureTableId: 0, featureTables: [ { featuresLength: 10, batchTexture: { translucentFeaturesLength: 0, }, }, ], }, shaderBuilder: new ShaderBuilder(), uniformMap: {}, }; it("adds shader functions", function () { var renderResources = clone(defaultRenderResources, true); var shaderBuilder = renderResources.shaderBuilder; CPUStylingPipelineStage.process(renderResources); ShaderBuilderTester.expectFragmentLinesEqual(shaderBuilder, [ _shadersCPUStylingStageFS, ]); ShaderBuilderTester.expectVertexLinesEqual(shaderBuilder, [ _shadersCPUStylingStageVS, ]); }); it("adds color blend uniform", function () { var renderResources = clone(defaultRenderResources, true); renderResources.model.colorBlendAmount = 0.75; renderResources.model.colorBlendMode = ColorBlendMode.MIX; var colorBlend = ColorBlendMode.getColorBlend( renderResources.model.colorBlendMode, renderResources.model.colorBlendAmount ); CPUStylingPipelineStage.process(renderResources); var shaderBuilder = renderResources.shaderBuilder; var uniformMap = renderResources.uniformMap; ShaderBuilderTester.expectHasFragmentUniforms(shaderBuilder, [ "uniform bool model_commandTranslucent;", "uniform float model_colorBlend;", ]); expect(uniformMap.model_colorBlend()).toEqual(colorBlend); }); it("doesn't add color blend uniform if model color is present", function () { var renderResources = clone(defaultRenderResources, true); renderResources.model.color = Color.RED; renderResources.model.colorBlendAmount = 0.75; renderResources.model.colorBlendMode = ColorBlendMode.MIX; CPUStylingPipelineStage.process(renderResources); var shaderBuilder = renderResources.shaderBuilder; var uniformMap = renderResources.uniformMap; ShaderBuilderTester.expectHasFragmentUniforms(shaderBuilder, [ "uniform bool model_commandTranslucent;", ]); expect(uniformMap.model_colorBlend).toBeUndefined(); }); it("adds command translucent uniform", function () { var renderResources = clone(defaultRenderResources, true); renderResources.alphaOptions.pass = Pass.TRANSLUCENT; CPUStylingPipelineStage.process(renderResources); var shaderBuilder = renderResources.shaderBuilder; var uniformMap = renderResources.uniformMap; ShaderBuilderTester.expectHasFragmentUniforms(shaderBuilder, [ "uniform bool model_commandTranslucent;", "uniform float model_colorBlend;", ]); expect(uniformMap.model_commandTranslucent()).toEqual(true); }); it("sets the style commands needed when only opaque commands are needed", function () { var renderResources = clone(defaultRenderResources, true); var batchTexture = { translucentFeaturesLength: 0, featuresLength: 10, }; renderResources.model.featureTables[0].batchTexture = batchTexture; CPUStylingPipelineStage.process(renderResources); expect(renderResources.styleCommandsNeeded).toEqual( StyleCommandsNeeded.ALL_OPAQUE ); }); it("sets the style commands needed when only translucent commands are needed", function () { var renderResources = clone(defaultRenderResources, true); var batchTexture = { translucentFeaturesLength: 10, }; renderResources.model.featureTables[0].batchTexture = batchTexture; CPUStylingPipelineStage.process(renderResources); expect(renderResources.styleCommandsNeeded).toEqual( StyleCommandsNeeded.ALL_TRANSLUCENT ); expect(renderResources.alphaOptions.alphaMode).toEqual(AlphaMode.BLEND); }); it("sets the style commands needed when both opaque and translucent commands are needed", function () { var renderResources = clone(defaultRenderResources, true); var batchTexture = { translucentFeaturesLength: 5, }; renderResources.model.featureTables[0].batchTexture = batchTexture; CPUStylingPipelineStage.process(renderResources); expect(renderResources.styleCommandsNeeded).toEqual( StyleCommandsNeeded.OPAQUE_AND_TRANSLUCENT ); expect(renderResources.alphaOptions.alphaMode).toEqual(AlphaMode.BLEND); }); });