@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
78 lines (71 loc) • 2.55 kB
JavaScript
import ColorBlendMode from "../ColorBlendMode.js";
import CPUStylingStageVS from "../../Shaders/Model/CPUStylingStageVS.js";
import CPUStylingStageFS from "../../Shaders/Model/CPUStylingStageFS.js";
import defined from "../../Core/defined.js";
import ModelColorPipelineStage from "./ModelColorPipelineStage.js";
import Pass from "../../Renderer/Pass.js";
import ShaderDestination from "../../Renderer/ShaderDestination.js";
/**
* The CPU styling stage is responsible for ensuring that the feature's color
* is applied at runtime.
*
* @namespace CPUStylingPipelineStage
*
* @private
*/
const CPUStylingPipelineStage = {
name: "CPUStylingPipelineStage", // Helps with debugging
};
/**
* Processes a primitive. This modifies the following parts of the render resources:
* <ul>
* <li>adds the styling code to both the vertex and fragment shaders</li>
* <li>adds the define to trigger the stage's shader functions</li>
* <li>adds a uniform with the model's color blend mode and amount</li>
* </ul>
*
* @param {PrimitiveRenderResources} renderResources The render resources for this primitive.
* @param {ModelComponents.Primitive} primitive The primitive.
* @param {FrameState} frameState The frame state.
*
* @private
*/
CPUStylingPipelineStage.process = function (
renderResources,
primitive,
frameState,
) {
const model = renderResources.model;
const shaderBuilder = renderResources.shaderBuilder;
shaderBuilder.addVertexLines(CPUStylingStageVS);
shaderBuilder.addFragmentLines(CPUStylingStageFS);
shaderBuilder.addDefine("USE_CPU_STYLING", undefined, ShaderDestination.BOTH);
// These uniforms may have already been added by the ModelColorStage
// if a static color is applied.
if (!defined(model.color)) {
shaderBuilder.addUniform(
"float",
ModelColorPipelineStage.COLOR_BLEND_UNIFORM_NAME,
ShaderDestination.FRAGMENT,
);
renderResources.uniformMap[
ModelColorPipelineStage.COLOR_BLEND_UNIFORM_NAME
] = function () {
return ColorBlendMode.getColorBlend(
model.colorBlendMode,
model.colorBlendAmount,
);
};
}
shaderBuilder.addUniform(
"bool",
"model_commandTranslucent",
ShaderDestination.BOTH,
);
renderResources.uniformMap.model_commandTranslucent = function () {
// Always check the current value, because custom shaders may
// change the value with the translucencyMode parameter
return renderResources.alphaOptions.pass === Pass.TRANSLUCENT;
};
};
export default CPUStylingPipelineStage;