|
@@ -2,33 +2,33 @@ import DataMap from './DataMap.js';
|
|
|
import ChainMap from './ChainMap.js';
|
|
|
import RenderObject from './RenderObject.js';
|
|
|
|
|
|
-class RenderObjects extends ChainMap {
|
|
|
+class RenderObjects {
|
|
|
|
|
|
constructor( renderer, nodes, geometries, pipelines, info ) {
|
|
|
|
|
|
- super();
|
|
|
-
|
|
|
this.renderer = renderer;
|
|
|
this.nodes = nodes;
|
|
|
this.geometries = geometries;
|
|
|
this.pipelines = pipelines;
|
|
|
this.info = info;
|
|
|
|
|
|
+ this.chainMaps = {};
|
|
|
this.dataMap = new DataMap();
|
|
|
|
|
|
}
|
|
|
|
|
|
- get( object, material, scene, camera, lightsNode ) {
|
|
|
+ get( object, material, scene, camera, lightsNode, passId ) {
|
|
|
|
|
|
+ const chainMap = this.getChainMap( passId );
|
|
|
const chainArray = [ object, material, scene, camera, lightsNode ];
|
|
|
|
|
|
- let renderObject = super.get( chainArray );
|
|
|
+ let renderObject = chainMap.get( chainArray );
|
|
|
|
|
|
if ( renderObject === undefined ) {
|
|
|
|
|
|
- renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode );
|
|
|
+ renderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, passId );
|
|
|
|
|
|
- this.set( chainArray, renderObject );
|
|
|
+ chainMap.set( chainArray, renderObject );
|
|
|
|
|
|
} else {
|
|
|
|
|
@@ -49,29 +49,36 @@ class RenderObjects extends ChainMap {
|
|
|
|
|
|
}
|
|
|
|
|
|
- dispose() {
|
|
|
+ getChainMap( passId = 'default' ) {
|
|
|
|
|
|
- super.dispose();
|
|
|
+ return this.chainMaps[ passId ] || ( this.chainMaps[ passId ] = new ChainMap() );
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
- this.dataMap.clear();
|
|
|
+ dispose() {
|
|
|
+
|
|
|
+ this.chainMaps = {};
|
|
|
+ this.dataMap = new DataMap();
|
|
|
|
|
|
}
|
|
|
|
|
|
- createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode ) {
|
|
|
+ createRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, passId ) {
|
|
|
|
|
|
+ const chainMap = this.getChainMap( passId );
|
|
|
+ const dataMap = this.dataMap;
|
|
|
const renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode );
|
|
|
|
|
|
- const data = this.dataMap.get( renderObject );
|
|
|
+ const data = dataMap.get( renderObject );
|
|
|
data.cacheKey = renderObject.getCacheKey();
|
|
|
|
|
|
renderObject.onDispose = () => {
|
|
|
|
|
|
- this.dataMap.delete( renderObject );
|
|
|
+ dataMap.delete( renderObject );
|
|
|
|
|
|
this.pipelines.delete( renderObject );
|
|
|
this.nodes.delete( renderObject );
|
|
|
|
|
|
- this.delete( renderObject.getChainArray() );
|
|
|
+ chainMap.delete( renderObject.getChainArray() );
|
|
|
|
|
|
};
|
|
|
|