最新代码
This commit is contained in:
93
public/sdk/three/jsm/renderers/common/RenderObjects.js
Normal file
93
public/sdk/three/jsm/renderers/common/RenderObjects.js
Normal file
@ -0,0 +1,93 @@
|
||||
import ChainMap from './ChainMap.js';
|
||||
import RenderObject from './RenderObject.js';
|
||||
|
||||
class RenderObjects {
|
||||
|
||||
constructor( renderer, nodes, geometries, pipelines, bindings, info ) {
|
||||
|
||||
this.renderer = renderer;
|
||||
this.nodes = nodes;
|
||||
this.geometries = geometries;
|
||||
this.pipelines = pipelines;
|
||||
this.bindings = bindings;
|
||||
this.info = info;
|
||||
|
||||
this.chainMaps = {};
|
||||
|
||||
}
|
||||
|
||||
get( object, material, scene, camera, lightsNode, renderContext, passId ) {
|
||||
|
||||
const chainMap = this.getChainMap( passId );
|
||||
const chainArray = [ object, material, renderContext, lightsNode ];
|
||||
|
||||
let renderObject = chainMap.get( chainArray );
|
||||
|
||||
if ( renderObject === undefined ) {
|
||||
|
||||
renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, passId );
|
||||
|
||||
chainMap.set( chainArray, renderObject );
|
||||
|
||||
} else {
|
||||
|
||||
renderObject.updateClipping( renderContext.clippingContext );
|
||||
|
||||
if ( renderObject.version !== material.version || renderObject.needsUpdate ) {
|
||||
|
||||
if ( renderObject.initialCacheKey !== renderObject.getCacheKey() ) {
|
||||
|
||||
renderObject.dispose();
|
||||
|
||||
renderObject = this.get( object, material, scene, camera, lightsNode, renderContext, passId );
|
||||
|
||||
} else {
|
||||
|
||||
renderObject.version = material.version;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return renderObject;
|
||||
|
||||
}
|
||||
|
||||
getChainMap( passId = 'default' ) {
|
||||
|
||||
return this.chainMaps[ passId ] || ( this.chainMaps[ passId ] = new ChainMap() );
|
||||
|
||||
}
|
||||
|
||||
dispose() {
|
||||
|
||||
this.chainMaps = {};
|
||||
|
||||
}
|
||||
|
||||
createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, passId ) {
|
||||
|
||||
const chainMap = this.getChainMap( passId );
|
||||
|
||||
const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext );
|
||||
|
||||
renderObject.onDispose = () => {
|
||||
|
||||
this.pipelines.delete( renderObject );
|
||||
this.bindings.delete( renderObject );
|
||||
this.nodes.delete( renderObject );
|
||||
|
||||
chainMap.delete( renderObject.getChainArray() );
|
||||
|
||||
};
|
||||
|
||||
return renderObject;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
export default RenderObjects;
|
Reference in New Issue
Block a user