ThreeJS WebGLObjects

549 阅读1分钟
  • three.js场景中每个实体都会被WebGLObjects处理
function WebGLObjects(gl, geometries, attributes, info) {
	let updateMap = new WeakMap();

	function update(object) {
		const frame = info.render.frame; //获取帧的计数(从程序开始的帧为0)

		const geometry = object.geometry;
		const buffergeometry = geometries.get(object, geometry); //获取geometries中缓存的object的geometry,与传入的参数geometry基本是一个东西

		// Update once per frame

		if (updateMap.get(buffergeometry) !== frame) { //每一帧都检查是不是geometry中的数据改变了,如果改变了就要更新vbo //如果多个mesh使用相同的geometry,则只需要更新一次

			geometries.update(buffergeometry); ////更新如果vbo没有创建 或者 geometry中的数据改变了,就更新geometry对应的vbo

			updateMap.set(buffergeometry, frame); //同步帧
		}

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

			attributes.update(object.instanceMatrix, 34962);

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

		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,
	};
}