为了实现自定义Primitive图元,对Cesium Primitive相关的源码进行了研究,理清了Primitive渲染流程。
1、Viewer和CesiumWidget中的render(),进行帧动画,触发Scene.render()
//Widgets/CesiumWidget/CesiumWidget.js
CesiumWidget.prototype.render = function () {
if (this._canRender) {
this._scene.initializeFrame();
var currentTime = this._clock.tick();
this._scene.render(currentTime);
} else {
this._clock.tick();
}
};
2、Scene.render()触发primitiveCollection.update(),每个primitive调用update()
//Scene/Scene.js
function updateAndRenderPrimitives(scene) {
var frameState = scene._frameState;
scene._groundPrimitives.update(frameState);
scene._primitives.update(frameState);//primitivecollection.update()触发primitive.update()
updateDebugFrustumPlanes(scene);
updateShadowMaps(scene);
if (scene._globe) {
scene._globe.render(frameState);
}
}
//Scene/Primitive.js
Primitive.prototype.update = function (frameState) {
if (
(!defined(this.geometryInstances) && this._va.length === 0) ||
(defined(this.geometryInstances) &&
Array.isArray(this.geometryInstances) &&
this.geometryInstances.length === 0) ||
!defined(this.appearance) ||
(frameState.mode !== SceneMode.SCENE3D && frameState.scene3DOnly) ||
(!frameState.passes.render && !frameState.passes.pick)
) {
return;
}
if (defined(this._error)) {
throw this._error;
}
//>>includeStart('debug', pragmas.debug);
if (defined(this.rtcCenter) && !frameState.scene3