import { Vector3 } from '../math/Vector3.js'; import { Color } from '../math/Color.js'; import { Object3D } from '../core/Object3D.js'; import { Mesh } from '../objects/Mesh.js'; import { MeshBasicMaterial } from '../materials/MeshBasicMaterial.js'; import { OctahedronGeometry } from '../geometries/OctahedronGeometry.js'; import { BufferAttribute } from '../core/BufferAttribute.js'; const _vector = /*@__PURE__*/ new Vector3(); const _color1 = /*@__PURE__*/ new Color(); const _color2 = /*@__PURE__*/ new Color(); class HemisphereLightHelper extends Object3D { constructor(light, size, color) { super(); this.light = light; this.light.updateMatrixWorld(); this.matrix = light.matrixWorld; this.matrixAutoUpdate = false; this.color = color; const geometry = new OctahedronGeometry(size); geometry.rotateY(Math.PI * 0.5); this.material = new MeshBasicMaterial({ wireframe: true, fog: false, toneMapped: false }); if (this.color === undefined) this.material.vertexColors = true; const position = geometry.getAttribute('position'); const colors = new Float32Array(position.count * 3); geometry.setAttribute('color', new BufferAttribute(colors, 3)); this.add(new Mesh(geometry, this.material)); this.update(); } dispose() { this.children[0].geometry.dispose(); this.children[0].material.dispose(); } update() { const mesh = this.children[0]; if (this.color !== undefined) { this.material.color.set(this.color); } else { const colors = mesh.geometry.getAttribute('color'); _color1.copy(this.light.color); _color2.copy(this.light.groundColor); for (let i = 0, l = colors.count; i < l; i++) { const color = i < l / 2 ? _color1 : _color2; colors.setXYZ(i, color.r, color.g, color.b); } colors.needsUpdate = true; } mesh.lookAt(_vector.setFromMatrixPosition(this.light.matrixWorld).negate()); } } export { HemisphereLightHelper };