@acransac/vtk.js
Version:
Visualization Toolkit for the Web
131 lines (104 loc) • 3.69 kB
JavaScript
import macro from 'vtk.js/Sources/macro';
import * as vtkMath from 'vtk.js/Sources/Common/Core/Math';
// ----------------------------------------------------------------------------
export const LIGHT_TYPES = ['HeadLight', 'CameraLight', 'SceneLight'];
// ----------------------------------------------------------------------------
// vtkLight methods
// ----------------------------------------------------------------------------
function vtkLight(publicAPI, model) {
// Set our className
model.classHierarchy.push('vtkLight');
publicAPI.getTransformedPosition = () => {
if (model.transformMatrix) {
return []; // FIXME !!!!
}
return [].concat(model.position);
};
publicAPI.getTransformedFocalPoint = () => {
if (model.transformMatrix) {
return []; // FIXME !!!!
}
return [].concat(model.focalPoint);
};
publicAPI.getDirection = () => {
if (model.directionMTime < model.mtime) {
model.direction[0] = model.focalPoint[0] - model.position[0];
model.direction[1] = model.focalPoint[1] - model.position[1];
model.direction[2] = model.focalPoint[2] - model.position[2];
vtkMath.normalize(model.direction);
model.directionMTime = model.mtime;
}
return model.direction;
};
publicAPI.setDirectionAngle = (elevation, azimuth) => {
const elevationRadians = vtkMath.radiansFromDegrees(elevation);
const azimuthRadians = vtkMath.radiansFromDegrees(azimuth);
publicAPI.setPosition(
Math.cos(elevationRadians) * Math.sin(azimuthRadians),
Math.sin(elevationRadians),
Math.cos(elevationRadians) * Math.cos(azimuthRadians)
);
publicAPI.setFocalPoint(0, 0, 0);
publicAPI.setPositional(0);
};
publicAPI.setLightTypeToHeadLight = () => {
publicAPI.setLightType('HeadLight');
};
publicAPI.setLightTypeToCameraLight = () => {
publicAPI.setLightType('CameraLight');
};
publicAPI.setLightTypeToSceneLight = () => {
publicAPI.setTransformMatrix(null);
publicAPI.setLightType('SceneLight');
};
publicAPI.lightTypeIsHeadLight = () => model.lightType === 'HeadLight';
publicAPI.lightTypeIsSceneLight = () => model.lightType === 'SceneLight';
publicAPI.lightTypeIsCameraLight = () => model.lightType === 'CameraLight';
}
// ----------------------------------------------------------------------------
// Object factory
// ----------------------------------------------------------------------------
const DEFAULT_VALUES = {
switch: true,
intensity: 1,
color: [1, 1, 1],
position: [0, 0, 1],
focalPoint: [0, 0, 0],
positional: false,
exponent: 1,
coneAngle: 30,
attenuationValues: [1, 0, 0],
transformMatrix: null,
lightType: 'SceneLight',
shadowAttenuation: 1,
direction: [0, 0, 0],
directionMTime: 0,
};
// ----------------------------------------------------------------------------
export function extend(publicAPI, model, initialValues = {}) {
Object.assign(model, DEFAULT_VALUES, initialValues);
// Build VTK API
macro.obj(publicAPI, model);
macro.setGet(publicAPI, model, [
'intensity',
'switch',
'positional',
'exponent',
'coneAngle',
'transformMatrix',
'lightType',
'shadowAttenuation',
]);
macro.setGetArray(
publicAPI,
model,
['color', 'position', 'focalPoint', 'attenuationValues'],
3
);
// Object methods
vtkLight(publicAPI, model);
}
// ----------------------------------------------------------------------------
export const newInstance = macro.newInstance(extend, 'vtkLight');
// ----------------------------------------------------------------------------
export default { newInstance, extend, LIGHT_TYPES };