UNPKG

@openhps/core

Version:

Open Hybrid Positioning System - Core component

110 lines (103 loc) 3.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SpotLightHelper = void 0; var _Vector = require("../math/Vector3.js"); var _Object3D = require("../core/Object3D.js"); var _LineSegments = require("../objects/LineSegments.js"); var _LineBasicMaterial = require("../materials/LineBasicMaterial.js"); var _BufferAttribute = require("../core/BufferAttribute.js"); var _BufferGeometry = require("../core/BufferGeometry.js"); const _vector = /*@__PURE__*/new _Vector.Vector3(); /** * This displays a cone shaped helper object for a {@link SpotLight}. * * ```js * const spotLight = new THREE.SpotLight( 0xffffff ); * spotLight.position.set( 10, 10, 10 ); * scene.add( spotLight ); * * const spotLightHelper = new THREE.SpotLightHelper( spotLight ); * scene.add( spotLightHelper ); * ``` * * @augments Object3D */ class SpotLightHelper extends _Object3D.Object3D { /** * Constructs a new spot light helper. * * @param {HemisphereLight} light - The light to be visualized. * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take * the color of the light. */ constructor(light, color) { super(); /** * The light being visualized. * * @type {SpotLight} */ this.light = light; this.matrixAutoUpdate = false; /** * The color parameter passed in the constructor. * If not set, the helper will take the color of the light. * * @type {number|Color|string} */ this.color = color; this.type = 'SpotLightHelper'; const geometry = new _BufferGeometry.BufferGeometry(); const positions = [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, -1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, -1, 1]; for (let i = 0, j = 1, l = 32; i < l; i++, j++) { const p1 = i / l * Math.PI * 2; const p2 = j / l * Math.PI * 2; positions.push(Math.cos(p1), Math.sin(p1), 1, Math.cos(p2), Math.sin(p2), 1); } geometry.setAttribute('position', new _BufferAttribute.Float32BufferAttribute(positions, 3)); const material = new _LineBasicMaterial.LineBasicMaterial({ fog: false, toneMapped: false }); this.cone = new _LineSegments.LineSegments(geometry, material); this.add(this.cone); this.update(); } /** * Frees the GPU-related resources allocated by this instance. Call this * method whenever this instance is no longer used in your app. */ dispose() { this.cone.geometry.dispose(); this.cone.material.dispose(); } /** * Updates the helper to match the position and direction of the * light being visualized. */ update() { this.light.updateWorldMatrix(true, false); this.light.target.updateWorldMatrix(true, false); // update the local matrix based on the parent and light target transforms if (this.parent) { this.parent.updateWorldMatrix(true); this.matrix.copy(this.parent.matrixWorld).invert().multiply(this.light.matrixWorld); } else { this.matrix.copy(this.light.matrixWorld); } this.matrixWorld.copy(this.light.matrixWorld); const coneLength = this.light.distance ? this.light.distance : 1000; const coneWidth = coneLength * Math.tan(this.light.angle); this.cone.scale.set(coneWidth, coneWidth, coneLength); _vector.setFromMatrixPosition(this.light.target.matrixWorld); this.cone.lookAt(_vector); if (this.color !== undefined) { this.cone.material.color.set(this.color); } else { this.cone.material.color.copy(this.light.color); } } } exports.SpotLightHelper = SpotLightHelper;