Cesium-Examples/three/examples/jsm/nodes/core/NodeFrame.js
2025-03-11 17:51:04 +08:00

111 lines
2.0 KiB
JavaScript

import { NodeUpdateType } from './constants.js';
class NodeFrame {
constructor() {
this.time = 0;
this.deltaTime = 0;
this.frameId = 0;
this.renderId = 0;
this.startTime = null;
this.frameMap = new WeakMap();
this.frameBeforeMap = new WeakMap();
this.renderMap = new WeakMap();
this.renderBeforeMap = new WeakMap();
this.renderer = null;
this.material = null;
this.camera = null;
this.object = null;
this.scene = null;
}
updateBeforeNode( node ) {
const updateType = node.getUpdateBeforeType();
if ( updateType === NodeUpdateType.FRAME ) {
if ( this.frameBeforeMap.get( node ) !== this.frameId ) {
this.frameBeforeMap.set( node, this.frameId );
node.updateBefore( this );
}
} else if ( updateType === NodeUpdateType.RENDER ) {
if ( this.renderBeforeMap.get( node ) !== this.renderId || this.frameBeforeMap.get( node ) !== this.frameId ) {
this.renderBeforeMap.set( node, this.renderId );
this.frameBeforeMap.set( node, this.frameId );
node.updateBefore( this );
}
} else if ( updateType === NodeUpdateType.OBJECT ) {
node.updateBefore( this );
}
}
updateNode( node ) {
const updateType = node.getUpdateType();
if ( updateType === NodeUpdateType.FRAME ) {
if ( this.frameMap.get( node ) !== this.frameId ) {
this.frameMap.set( node, this.frameId );
node.update( this );
}
} else if ( updateType === NodeUpdateType.RENDER ) {
if ( this.renderMap.get( node ) !== this.renderId || this.frameMap.get( node ) !== this.frameId ) {
this.renderMap.set( node, this.renderId );
this.frameMap.set( node, this.frameId );
node.update( this );
}
} else if ( updateType === NodeUpdateType.OBJECT ) {
node.update( this );
}
}
update() {
this.frameId ++;
if ( this.lastTime === undefined ) this.lastTime = performance.now();
this.deltaTime = ( performance.now() - this.lastTime ) / 1000;
this.lastTime = performance.now();
this.time += this.deltaTime;
}
}
export default NodeFrame;