Spaces:
Running
Running
/** | |
* @author mrdoob / http://mrdoob.com/ | |
*/ | |
function painterSortStable( a, b ) { | |
if ( a.groupOrder !== b.groupOrder ) { | |
return a.groupOrder - b.groupOrder; | |
} else if ( a.renderOrder !== b.renderOrder ) { | |
return a.renderOrder - b.renderOrder; | |
} else if ( 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.groupOrder !== b.groupOrder ) { | |
return a.groupOrder - b.groupOrder; | |
} else if ( a.renderOrder !== b.renderOrder ) { | |
return a.renderOrder - b.renderOrder; | |
} else if ( a.z !== b.z ) { | |
return b.z - a.z; | |
} else { | |
return a.id - b.id; | |
} | |
} | |
function WebGLRenderList() { | |
var renderItems = []; | |
var renderItemsIndex = 0; | |
var opaque = []; | |
var transparent = []; | |
var defaultProgram = { id: - 1 }; | |
function init() { | |
renderItemsIndex = 0; | |
opaque.length = 0; | |
transparent.length = 0; | |
} | |
function getNextRenderItem( object, geometry, material, groupOrder, z, group ) { | |
var renderItem = renderItems[ renderItemsIndex ]; | |
if ( renderItem === undefined ) { | |
renderItem = { | |
id: object.id, | |
object: object, | |
geometry: geometry, | |
material: material, | |
program: material.program || defaultProgram, | |
groupOrder: groupOrder, | |
renderOrder: object.renderOrder, | |
z: z, | |
group: group | |
}; | |
renderItems[ renderItemsIndex ] = renderItem; | |
} else { | |
renderItem.id = object.id; | |
renderItem.object = object; | |
renderItem.geometry = geometry; | |
renderItem.material = material; | |
renderItem.program = material.program || defaultProgram; | |
renderItem.groupOrder = groupOrder; | |
renderItem.renderOrder = object.renderOrder; | |
renderItem.z = z; | |
renderItem.group = group; | |
} | |
renderItemsIndex ++; | |
return renderItem; | |
} | |
function push( object, geometry, material, groupOrder, z, group ) { | |
var renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); | |
( material.transparent === true ? transparent : opaque ).push( renderItem ); | |
} | |
function unshift( object, geometry, material, groupOrder, z, group ) { | |
var renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group ); | |
( material.transparent === true ? transparent : opaque ).unshift( renderItem ); | |
} | |
function sort() { | |
if ( opaque.length > 1 ) opaque.sort( painterSortStable ); | |
if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable ); | |
} | |
return { | |
opaque: opaque, | |
transparent: transparent, | |
init: init, | |
push: push, | |
unshift: unshift, | |
sort: sort | |
}; | |
} | |
function WebGLRenderLists() { | |
var lists = {}; | |
function onSceneDispose( event ) { | |
var scene = event.target; | |
scene.removeEventListener( 'dispose', onSceneDispose ); | |
delete lists[ scene.id ]; | |
} | |
function get( scene, camera ) { | |
var cameras = lists[ scene.id ]; | |
var list; | |
if ( cameras === undefined ) { | |
list = new WebGLRenderList(); | |
lists[ scene.id ] = {}; | |
lists[ scene.id ][ camera.id ] = list; | |
scene.addEventListener( 'dispose', onSceneDispose ); | |
} else { | |
list = cameras[ camera.id ]; | |
if ( list === undefined ) { | |
list = new WebGLRenderList(); | |
cameras[ camera.id ] = list; | |
} | |
} | |
return list; | |
} | |
function dispose() { | |
lists = {}; | |
} | |
return { | |
get: get, | |
dispose: dispose | |
}; | |
} | |
export { WebGLRenderLists }; | |