WebGLRenderLists.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. function painterSortStable( a, b ) {
  5. if ( a.renderOrder !== b.renderOrder ) {
  6. return a.renderOrder - b.renderOrder;
  7. } else if ( a.program && b.program && a.program !== b.program ) {
  8. return a.program.id - b.program.id;
  9. } else if ( a.material.id !== b.material.id ) {
  10. return a.material.id - b.material.id;
  11. } else if ( a.z !== b.z ) {
  12. return a.z - b.z;
  13. } else {
  14. return a.id - b.id;
  15. }
  16. }
  17. function reversePainterSortStable( a, b ) {
  18. if ( a.renderOrder !== b.renderOrder ) {
  19. return a.renderOrder - b.renderOrder;
  20. } if ( a.z !== b.z ) {
  21. return b.z - a.z;
  22. } else {
  23. return a.id - b.id;
  24. }
  25. }
  26. function WebGLRenderList() {
  27. var renderItems = [];
  28. var renderItemsIndex = 0;
  29. var opaque = [];
  30. var transparent = [];
  31. function init() {
  32. renderItemsIndex = 0;
  33. opaque.length = 0;
  34. transparent.length = 0;
  35. }
  36. function getNextRenderItem( object, geometry, material, z, group ) {
  37. var renderItem = renderItems[ renderItemsIndex ];
  38. if ( renderItem === undefined ) {
  39. renderItem = {
  40. id: object.id,
  41. object: object,
  42. geometry: geometry,
  43. material: material,
  44. program: material.program,
  45. renderOrder: object.renderOrder,
  46. z: z,
  47. group: group
  48. };
  49. renderItems[ renderItemsIndex ] = renderItem;
  50. } else {
  51. renderItem.id = object.id;
  52. renderItem.object = object;
  53. renderItem.geometry = geometry;
  54. renderItem.material = material;
  55. renderItem.program = material.program;
  56. renderItem.renderOrder = object.renderOrder;
  57. renderItem.z = z;
  58. renderItem.group = group;
  59. }
  60. renderItemsIndex ++;
  61. return renderItem;
  62. }
  63. function push( object, geometry, material, z, group ) {
  64. var renderItem = getNextRenderItem( object, geometry, material, z, group );
  65. ( material.transparent === true ? transparent : opaque ).push( renderItem );
  66. }
  67. function unshift( object, geometry, material, z, group ) {
  68. var renderItem = getNextRenderItem( object, geometry, material, z, group );
  69. ( material.transparent === true ? transparent : opaque ).unshift( renderItem );
  70. }
  71. function sort() {
  72. if ( opaque.length > 1 ) opaque.sort( painterSortStable );
  73. if ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );
  74. }
  75. return {
  76. opaque: opaque,
  77. transparent: transparent,
  78. init: init,
  79. push: push,
  80. unshift: unshift,
  81. sort: sort
  82. };
  83. }
  84. function WebGLRenderLists() {
  85. var lists = {};
  86. function get( scene, camera ) {
  87. var cameras = lists[ scene.id ];
  88. var list;
  89. if ( cameras === undefined ) {
  90. list = new WebGLRenderList();
  91. lists[ scene.id ] = {};
  92. lists[ scene.id ][ camera.id ] = list;
  93. } else {
  94. list = cameras[ camera.id ];
  95. if ( list === undefined ) {
  96. list = new WebGLRenderList();
  97. cameras[ camera.id ] = list;
  98. }
  99. }
  100. return list;
  101. }
  102. function dispose() {
  103. lists = {};
  104. }
  105. return {
  106. get: get,
  107. dispose: dispose
  108. };
  109. }
  110. export { WebGLRenderLists };