/** * @author mrdoob / http://mrdoob.com/ */ function painterSortStable( a, b ) { if ( a.renderOrder !== b.renderOrder ) { return a.renderOrder - b.renderOrder; } else if ( a.program && b.program && a.program !== b.program ) { return a.program.id - b.program.id; } else if ( a.material.id !== b.material.id ) { return a.material.id - b.material.id; } else if ( a.z !== b.z ) { return a.z - b.z; } else { return a.id - b.id; } } function reversePainterSortStable( a, b ) { if ( a.renderOrder !== b.renderOrder ) { return a.renderOrder - b.renderOrder; } if ( a.z !== b.z ) { return b.z - a.z; } else { return a.id - b.id; } } function WebGLRenderList() { var opaque = []; var opaqueLastIndex = - 1; var transparent = []; var transparentLastIndex = - 1; function init() { opaqueLastIndex = - 1; transparentLastIndex = - 1; } function push( object, geometry, material, z, group ) { var array, index; // allocate the next position in the appropriate array if ( material.transparent ) { array = transparent; index = ++ transparentLastIndex; } else { array = opaque; index = ++ opaqueLastIndex; } // recycle existing render item or grow the array var renderItem = array[ index ]; if ( renderItem ) { renderItem.id = object.id; renderItem.object = object; renderItem.geometry = geometry; renderItem.material = material; renderItem.program = material.program; renderItem.renderOrder = object.renderOrder; renderItem.z = z; renderItem.group = group; } else { renderItem = { id: object.id, object: object, geometry: geometry, material: material, program: material.program, renderOrder: object.renderOrder, z: z, group: group }; // assert( index === array.length ); array.push( renderItem ); } } function finish() { opaque.length = opaqueLastIndex + 1; transparent.length = transparentLastIndex + 1; } function sort() { opaque.sort( painterSortStable ); transparent.sort( reversePainterSortStable ); } return { opaque: opaque, transparent: transparent, init: init, push: push, finish: finish, sort: sort }; } function WebGLRenderLists() { var lists = {}; function get( scene, camera ) { var hash = scene.id + ',' + camera.id; var list = lists[ hash ]; if ( list === undefined ) { // console.log( 'THREE.WebGLRenderLists:', hash ); list = new WebGLRenderList(); lists[ hash ] = list; } return list; } function dispose() { lists = {}; } return { get: get, dispose: dispose }; } export { WebGLRenderLists };