src/viewer/scene/postfx/CrossSections.js
import {Component} from '../Component.js';
/**
* @desc Configures cross-section slices for a {@link Scene}.
*
* ## Overview
*
* Cross-sections allow to create an additional colored slice for used clipping planes. It is only a visual effect
* calculated by shaders. It makes it easier to see the intersection between the model and the clipping plane this way.
*
* ## Usage
*
* In the example below, we'll configure CrossSections to manipulate the slice representation.
*
* ````javascript
* //------------------------------------------------------------------------------------------------------------------
* // Import the modules we need for this example
* //------------------------------------------------------------------------------------------------------------------
*
* import {PhongMaterial, Viewer, math, SectionPlanesPlugin, XKTLoaderPlugin, Mesh, ReadableGeometry, buildPolylineGeometryFromCurve, SplineCurve} from "../../dist/xeokit-sdk.es.js";
*
* //------------------------------------------------------------------------------------------------------------------
* // Create a Viewer and arrange the camera
* //------------------------------------------------------------------------------------------------------------------
*
* const viewer = new Viewer({
* canvasId: "myCanvas",
* transparent: true
* });
*
* viewer.camera.eye = [-2.341298674548419, 22.43987089731119, 7.236688436028655];
* viewer.camera.look = [4.399999999999963, 3.7240000000000606, 8.899000000000006];
* viewer.camera.up = [0.9102954845584759, 0.34781746407929504, 0.22446635042673466];
*
* const cameraControl = viewer.cameraControl;
* cameraControl.navMode = "orbit";
* cameraControl.followPointer = true;
*
* //----------------------------------------------------------------------------------------------------------------------
* // Create a xeokit loader plugin, load a model, fit to view
* //----------------------------------------------------------------------------------------------------------------------
*
* const xktLoader = new XKTLoaderPlugin(viewer);
*
* var t0 = performance.now();
*
* document.getElementById("time").innerHTML = "Loading model...";
*
* const sceneModel = xktLoader.load({
* id: "myModel",
* src: "../../assets/models/xkt/v10/glTF-Embedded/Duplex_A_20110505.glTFEmbedded.xkt",
* edges: true
* });
*
* sceneModel.on("loaded", () => {
* var t1 = performance.now();
* document.getElementById("time").innerHTML = "Model loaded in " + Math.floor(t1 - t0) / 1000.0 + " seconds<br>Objects: " + sceneModel.numEntities;
*
* let path = new SplineCurve(viewer.scene, {
* points: [
* [0, 0, -10],
* [0, 0, -3],
* [10, 0, 10],
* [10, 0, 30],
* ],
* });
*
* new Mesh(viewer.scene, {
* geometry: new ReadableGeometry(viewer.scene, buildPolylineGeometryFromCurve({
* id: "SplineCurve",
* curve: path,
* divisions: 50,
* })),
* material: new PhongMaterial(viewer.scene, {
* emissive: [1, 0, 0]
* })
* });
*
* //------------------------------------------------------------------------------------------------------------------
* // Create a moving SectionPlane, that moves through the table models
* //------------------------------------------------------------------------------------------------------------------
*
* const sectionPlanes = new SectionPlanesPlugin(viewer, {
* overviewCanvasId: "mySectionPlanesOverviewCanvas",
* overviewVisible: true
* });
*
* let currentPoint = path.getPoint(0);
* let currentDirection = path.getTangent(0);
*
* const sectionPlane = sectionPlanes.createSectionPlane({
* id: "mySectionPlane",
* pos: currentPoint,
* dir: currentDirection
* });
*
* sectionPlanes.showControl(sectionPlane.id);
*
* //------------------------------------------------------------------------------------------------------------------
* // Controlling SectionPlane position and direction
* //------------------------------------------------------------------------------------------------------------------
*
* let currentT = 0.0;
* document.getElementById("section_path").oninput = function() {
* currentT = Number(document.getElementById("section_path").value);
* currentPoint = path.getPoint(currentT);
* currentDirection = path.getTangent(currentT);
* sectionPlane.pos = currentPoint;
* sectionPlane.dir = currentDirection;
* };
*
* window.viewer = viewer;
*
* //------------------------------------------------------------------------------------------------------------------
* // Controlling CrossSections settings
* //------------------------------------------------------------------------------------------------------------------
*
* viewer.scene.crossSections.sliceThickness = 0.05;
* viewer.scene.crossSections.sliceColor = [0.0, 0.0, 0.0, 1.0];
* });
* ````
*
* [[Run this example](https://xeokit.github.io/xeokit-sdk/examples/slicing/#SectionPlanesPlugin_Duplex_SectionPath_CrossSections)]
*
*/
class CrossSections extends Component {
/** @private */
constructor(owner, cfg = {}) {
super(owner, cfg);
this.sliceColor = cfg.sliceColor;
this.sliceThickness = cfg.sliceThickness;
}
/**
* Sets the thickness of a slice created by a section.
*
* Default value is ````0.0````.
*
* @type {Number}
*/
set sliceThickness(value) {
if (value === undefined || value === null) {
value = 0.0;
}
if (this._sliceThickness === value) {
return;
}
this._sliceThickness = value;
this.glRedraw();
}
/**
* Gets the thickness of a slice created by a section.
*
* Default value is ````0.0````.
*
* @type {Number}
*/
get sliceThickness() {
return this._sliceThickness;
}
/**
* Sets the color of a slice created by a section.
*
* Default value is ````[0.0, 0.0, 0.0, 1.0]````.
*
* @type {Number}
*/
set sliceColor(value) {
if (value === undefined || value === null) {
value = [0.0, 0.0, 0.0, 1.0];
}
if (this._sliceColor === value) {
return;
}
this._sliceColor = value;
this.glRedraw();
}
/**
* Gets the color of a slice created by a section.
*
* Default value is ````[0.0, 0.0, 0.0, 1.0]````.
*
* @type {Number}
*/
get sliceColor() {
return this._sliceColor;
}
/**
* Destroys this component.
*/
destroy() {
super.destroy();
}
}
export {CrossSections};