File size: 2,052 Bytes
2b7aae2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { Vector3 } from '../math/Vector3.js';
import { Object3D } from '../core/Object3D.js';
import { Line } from '../objects/Line.js';
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
import { BufferGeometry } from '../core/BufferGeometry.js';
import { LineBasicMaterial } from '../materials/LineBasicMaterial.js';

const _v1 = /*@__PURE__*/ new Vector3();
const _v2 = /*@__PURE__*/ new Vector3();
const _v3 = /*@__PURE__*/ new Vector3();

class DirectionalLightHelper extends Object3D {
	constructor(light, size, color) {
		super();
		this.light = light;
		this.light.updateMatrixWorld();

		this.matrix = light.matrixWorld;
		this.matrixAutoUpdate = false;

		this.color = color;

		if (size === undefined) size = 1;

		let geometry = new BufferGeometry();
		geometry.setAttribute('position', new Float32BufferAttribute([-size, size, 0, size, size, 0, size, -size, 0, -size, -size, 0, -size, size, 0], 3));

		const material = new LineBasicMaterial({ fog: false, toneMapped: false });

		this.lightPlane = new Line(geometry, material);
		this.add(this.lightPlane);

		geometry = new BufferGeometry();
		geometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3));

		this.targetLine = new Line(geometry, material);
		this.add(this.targetLine);

		this.update();
	}

	dispose() {
		this.lightPlane.geometry.dispose();
		this.lightPlane.material.dispose();
		this.targetLine.geometry.dispose();
		this.targetLine.material.dispose();
	}

	update() {
		_v1.setFromMatrixPosition(this.light.matrixWorld);
		_v2.setFromMatrixPosition(this.light.target.matrixWorld);
		_v3.subVectors(_v2, _v1);

		this.lightPlane.lookAt(_v2);

		if (this.color !== undefined) {
			this.lightPlane.material.color.set(this.color);
			this.targetLine.material.color.set(this.color);
		} else {
			this.lightPlane.material.color.copy(this.light.color);
			this.targetLine.material.color.copy(this.light.color);
		}

		this.targetLine.lookAt(_v2);
		this.targetLine.scale.z = _v3.length();
	}
}

export { DirectionalLightHelper };