File size: 1,234 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
function WebGLObjects(gl, geometries, attributes, info) {
	let updateMap = new WeakMap();

	function update(object) {
		const frame = info.render.frame;

		const geometry = object.geometry;
		const buffergeometry = geometries.get(object, geometry);

		// Update once per frame

		if (updateMap.get(buffergeometry) !== frame) {
			geometries.update(buffergeometry);

			updateMap.set(buffergeometry, frame);
		}

		if (object.isInstancedMesh) {
			if (object.hasEventListener('dispose', onInstancedMeshDispose) === false) {
				object.addEventListener('dispose', onInstancedMeshDispose);
			}

			attributes.update(object.instanceMatrix, gl.ARRAY_BUFFER);

			if (object.instanceColor !== null) {
				attributes.update(object.instanceColor, gl.ARRAY_BUFFER);
			}
		}

		return buffergeometry;
	}

	function dispose() {
		updateMap = new WeakMap();
	}

	function onInstancedMeshDispose(event) {
		const instancedMesh = event.target;

		instancedMesh.removeEventListener('dispose', onInstancedMeshDispose);

		attributes.remove(instancedMesh.instanceMatrix);

		if (instancedMesh.instanceColor !== null) attributes.remove(instancedMesh.instanceColor);
	}

	return {
		update: update,
		dispose: dispose,
	};
}

export { WebGLObjects };