@cesium/engine
Version:
CesiumJS is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.
99 lines (87 loc) • 3.29 kB
JavaScript
import combine from "../../Core/combine.js";
import ModelClippingPolygonsStageVS from "../../Shaders/Model/ModelClippingPolygonsStageVS.js";
import ModelClippingPolygonsStageFS from "../../Shaders/Model/ModelClippingPolygonsStageFS.js";
import ShaderDestination from "../../Renderer/ShaderDestination.js";
/**
* The model clipping planes stage is responsible for applying clipping planes to the model.
*
* @namespace ModelClippingPolygonsPipelineStage
*
* @private
*/
const ModelClippingPolygonsPipelineStage = {
name: "ModelClippingPolygonsPipelineStage", // Helps with debugging
};
/**
* Process a model for polygon clipping. This modifies the following parts of the render resources:
*
* <ul>
* <li>adds a define to both the vertex and fragment shaders to indicate that the model has clipping polygons</li>
* <li>adds the defines to both the vertex and fragment shaders for parameters related to clipping polygons, such as the number of polygons</li>
* <li>adds a function to the vertex shader to determine lookup uvs</li>
* <li>adds a function to the fragment shader to discard clipped regions</li>
* <li>adds the uniforms to the vertex and fragment shaders for the clipping extents texture and clipping distance respectively</li>
* <li>adds a varying for lookup uvs in the clipping texture</li>
*</ul>
*
* @param {ModelRenderResources} renderResources The render resources for this model.
* @param {Model} model The model.
* @param {FrameState} frameState The frameState.
*
* @private
*/
ModelClippingPolygonsPipelineStage.process = function (
renderResources,
model,
frameState,
) {
const clippingPolygons = model.clippingPolygons;
const shaderBuilder = renderResources.shaderBuilder;
shaderBuilder.addDefine(
"ENABLE_CLIPPING_POLYGONS",
undefined,
ShaderDestination.BOTH,
);
if (clippingPolygons.inverse) {
shaderBuilder.addDefine(
"CLIPPING_INVERSE",
undefined,
ShaderDestination.FRAGMENT,
);
}
shaderBuilder.addDefine(
"CLIPPING_POLYGON_REGIONS_LENGTH",
clippingPolygons.extentsCount,
ShaderDestination.BOTH,
);
shaderBuilder.addUniform(
"sampler2D",
"model_clippingDistance",
ShaderDestination.FRAGMENT,
);
shaderBuilder.addUniform(
"sampler2D",
"model_clippingExtents",
ShaderDestination.VERTEX,
);
shaderBuilder.addVarying("vec2", "v_clippingPosition");
shaderBuilder.addVarying("int", "v_regionIndex", "flat");
shaderBuilder.addVertexLines(ModelClippingPolygonsStageVS);
shaderBuilder.addFragmentLines(ModelClippingPolygonsStageFS);
const uniformMap = {
model_clippingDistance: function () {
return (
// The later should never happen during a render pass, see https://github.com/CesiumGS/cesium/issues/12725
clippingPolygons.clippingTexture ?? frameState.context.defaultTexture
);
},
model_clippingExtents: function () {
return (
// The later should never happen during a render pass, see https://github.com/CesiumGS/cesium/issues/12725
clippingPolygons.extentsTexture ?? frameState.context.defaultTexture
);
},
};
renderResources.uniformMap = combine(uniformMap, renderResources.uniformMap);
};
export default ModelClippingPolygonsPipelineStage;