WebGLRenderLists.tests.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. /**
  2. * @author TristanVALCKE / https://github.com/Itee
  3. */
  4. /* global QUnit */
  5. import { WebGLRenderLists, WebGLRenderList } from '../../../../../src/renderers/webgl/WebGLRenderLists';
  6. import { Camera } from '../../../../../src/cameras/Camera';
  7. import { Scene } from '../../../../../src/scenes/Scene';
  8. export default QUnit.module( 'Renderers', () => {
  9. QUnit.module( 'WebGL', () => {
  10. QUnit.module( 'WebGLRenderLists', () => {
  11. // PUBLIC STUFF
  12. QUnit.test( "get", ( assert ) => {
  13. var renderLists = new WebGLRenderLists();
  14. var sceneA = new Scene();
  15. var sceneB = new Scene();
  16. var cameraA = new Camera();
  17. var cameraB = new Camera();
  18. var listAA = renderLists.get( sceneA, cameraA );
  19. var listAB = renderLists.get( sceneA, cameraB );
  20. var listBA = renderLists.get( sceneB, cameraA );
  21. assert.propEqual( listAA, new WebGLRenderList(), "listAA is type of WebGLRenderList." );
  22. assert.propEqual( listAB, new WebGLRenderList(), "listAB is type of WebGLRenderList." );
  23. assert.ok( listAA !== listAB, "Render lists for camera A and B with same scene are different." );
  24. assert.ok( listAA !== listBA, "Render lists for scene A and B with same camera are different." );
  25. assert.ok( listAA === renderLists.get( sceneA, cameraA ), "The same list is returned when called with the same scene, camera." );
  26. } );
  27. QUnit.test( "dispose", ( assert ) => {
  28. var renderLists = new WebGLRenderLists();
  29. var scene = new Scene();
  30. var camera = new Camera();
  31. var list1 = renderLists.get( scene, camera );
  32. scene.dispose()
  33. var list2 = renderLists.get( scene, camera );
  34. assert.ok( list1 !== list2, "New list should be different after disposing of the scene." );
  35. } );
  36. } );
  37. QUnit.module( 'WebGLRenderList', () => {
  38. QUnit.test( 'init', ( assert ) => {
  39. var list = new WebGLRenderList();
  40. assert.ok( list.transparent.length === 0, 'Transparent list defaults to length 0.' );
  41. assert.ok( list.opaque.length === 0, 'Opaque list defaults to length 0.' );
  42. list.push( {}, {}, { transparent: true }, 0, 0, {} );
  43. list.push( {}, {}, { transparent: false }, 0, 0, {} );
  44. assert.ok( list.transparent.length === 1, 'Transparent list is length 1 after adding transparent item.' );
  45. assert.ok( list.opaque.length === 1, 'Opaque list list is length 1 after adding opaque item.' );
  46. list.init();
  47. assert.ok( list.transparent.length === 0, 'Transparent list is length 0 after calling init.' );
  48. assert.ok( list.opaque.length === 0, 'Opaque list list is length 0 after calling init.' );
  49. } );
  50. QUnit.test( 'push', ( assert ) => {
  51. var list = new WebGLRenderList();
  52. var objA = { id: 'A', renderOrder: 0 };
  53. var matA = { transparent: true, program: { id: 1 } };
  54. var geoA = {};
  55. var objB = { id: 'B', renderOrder: 0 };
  56. var matB = { transparent: true, program: { id: 2 } };
  57. var geoB = {};
  58. var objC = { id: 'C', renderOrder: 0 };
  59. var matC = { transparent: false, program: { id: 3 } };
  60. var geoC = {};
  61. var objD = { id: 'D', renderOrder: 0 };
  62. var matD = { transparent: false, program: { id: 4 } };
  63. var geoD = {};
  64. list.push( objA, geoA, matA, 0, 0.5, {} );
  65. assert.ok( list.transparent.length === 1, 'Transparent list is length 1 after adding transparent item.' );
  66. assert.ok( list.opaque.length === 0, 'Opaque list list is length 0 after adding transparent item.' );
  67. assert.deepEqual(
  68. list.transparent[ 0 ],
  69. {
  70. id: 'A',
  71. object: objA,
  72. geometry: geoA,
  73. material: matA,
  74. program: matA.program,
  75. groupOrder: 0,
  76. renderOrder: 0,
  77. z: 0.5,
  78. group: {}
  79. },
  80. 'The first transparent render list item is structured correctly.'
  81. );
  82. list.push( objB, geoB, matB, 1, 1.5, {} );
  83. assert.ok( list.transparent.length === 2, 'Transparent list is length 2 after adding second transparent item.' );
  84. assert.ok( list.opaque.length === 0, 'Opaque list list is length 0 after adding second transparent item.' );
  85. assert.deepEqual(
  86. list.transparent[ 1 ],
  87. {
  88. id: 'B',
  89. object: objB,
  90. geometry: geoB,
  91. material: matB,
  92. program: matB.program,
  93. groupOrder: 1,
  94. renderOrder: 0,
  95. z: 1.5,
  96. group: {}
  97. },
  98. 'The second transparent render list item is structured correctly.'
  99. );
  100. list.push( objC, geoC, matC, 2, 2.5, {} );
  101. assert.ok( list.transparent.length === 2, 'Transparent list is length 2 after adding first opaque item.' );
  102. assert.ok( list.opaque.length === 1, 'Opaque list list is length 1 after adding first opaque item.' );
  103. assert.deepEqual(
  104. list.opaque[ 0 ],
  105. {
  106. id: 'C',
  107. object: objC,
  108. geometry: geoC,
  109. material: matC,
  110. program: matC.program,
  111. groupOrder: 2,
  112. renderOrder: 0,
  113. z: 2.5,
  114. group: {}
  115. },
  116. 'The first opaque render list item is structured correctly.'
  117. );
  118. list.push( objD, geoD, matD, 3, 3.5, {} );
  119. assert.ok( list.transparent.length === 2, 'Transparent list is length 2 after adding second opaque item.' );
  120. assert.ok( list.opaque.length === 2, 'Opaque list list is length 2 after adding second opaque item.' );
  121. assert.deepEqual(
  122. list.opaque[ 1 ],
  123. {
  124. id: 'D',
  125. object: objD,
  126. geometry: geoD,
  127. material: matD,
  128. program: matD.program,
  129. groupOrder: 3,
  130. renderOrder: 0,
  131. z: 3.5,
  132. group: {}
  133. },
  134. 'The second opaque render list item is structured correctly.'
  135. );
  136. } );
  137. QUnit.test( 'unshift', ( assert ) => {
  138. var list = new WebGLRenderList();
  139. var objA = { id: 'A', renderOrder: 0 };
  140. var matA = { transparent: true, program: { id: 1 } };
  141. var geoA = {};
  142. var objB = { id: 'B', renderOrder: 0 };
  143. var matB = { transparent: true, program: { id: 2 } };
  144. var geoB = {};
  145. var objC = { id: 'C', renderOrder: 0 };
  146. var matC = { transparent: false, program: { id: 3 } };
  147. var geoC = {};
  148. var objD = { id: 'D', renderOrder: 0 };
  149. var matD = { transparent: false, program: { id: 4 } };
  150. var geoD = {};
  151. list.unshift( objA, geoA, matA, 0, 0.5, {} );
  152. assert.ok( list.transparent.length === 1, 'Transparent list is length 1 after adding transparent item.' );
  153. assert.ok( list.opaque.length === 0, 'Opaque list list is length 0 after adding transparent item.' );
  154. assert.deepEqual(
  155. list.transparent[ 0 ],
  156. {
  157. id: 'A',
  158. object: objA,
  159. geometry: geoA,
  160. material: matA,
  161. program: matA.program,
  162. groupOrder: 0,
  163. renderOrder: 0,
  164. z: 0.5,
  165. group: {}
  166. },
  167. 'The first transparent render list item is structured correctly.'
  168. );
  169. list.unshift( objB, geoB, matB, 1, 1.5, {} );
  170. assert.ok( list.transparent.length === 2, 'Transparent list is length 2 after adding second transparent item.' );
  171. assert.ok( list.opaque.length === 0, 'Opaque list list is length 0 after adding second transparent item.' );
  172. assert.deepEqual(
  173. list.transparent[ 0 ],
  174. {
  175. id: 'B',
  176. object: objB,
  177. geometry: geoB,
  178. material: matB,
  179. program: matB.program,
  180. groupOrder: 1,
  181. renderOrder: 0,
  182. z: 1.5,
  183. group: {}
  184. },
  185. 'The second transparent render list item is structured correctly.'
  186. );
  187. list.unshift( objC, geoC, matC, 2, 2.5, {} );
  188. assert.ok( list.transparent.length === 2, 'Transparent list is length 2 after adding first opaque item.' );
  189. assert.ok( list.opaque.length === 1, 'Opaque list list is length 1 after adding first opaque item.' );
  190. assert.deepEqual(
  191. list.opaque[ 0 ],
  192. {
  193. id: 'C',
  194. object: objC,
  195. geometry: geoC,
  196. material: matC,
  197. program: matC.program,
  198. groupOrder: 2,
  199. renderOrder: 0,
  200. z: 2.5,
  201. group: {}
  202. },
  203. 'The first opaque render list item is structured correctly.'
  204. );
  205. list.unshift( objD, geoD, matD, 3, 3.5, {} );
  206. assert.ok( list.transparent.length === 2, 'Transparent list is length 2 after adding second opaque item.' );
  207. assert.ok( list.opaque.length === 2, 'Opaque list list is length 2 after adding second opaque item.' );
  208. assert.deepEqual(
  209. list.opaque[ 0 ],
  210. {
  211. id: 'D',
  212. object: objD,
  213. geometry: geoD,
  214. material: matD,
  215. program: matD.program,
  216. groupOrder: 3,
  217. renderOrder: 0,
  218. z: 3.5,
  219. group: {}
  220. },
  221. 'The second opaque render list item is structured correctly.'
  222. );
  223. } );
  224. QUnit.test( 'sort', ( assert ) => {
  225. var list = new WebGLRenderList();
  226. var items = [ { id: 4 }, { id: 5 }, { id: 2 }, { id: 3 } ];
  227. items.forEach( item => {
  228. list.push( item, {}, { transparent: true }, 0, 0, {} );
  229. list.push( item, {}, { transparent: false }, 0, 0, {} );
  230. } );
  231. list.sort( ( a, b ) => a.id - b.id, ( a, b ) => b.id - a.id );
  232. assert.deepEqual(
  233. list.opaque.map( item => item.id ),
  234. [ 2, 3, 4, 5 ],
  235. 'The opaque sort is applied to the opaque items list.'
  236. );
  237. assert.deepEqual(
  238. list.transparent.map( item => item.id ),
  239. [ 5, 4, 3, 2 ],
  240. 'The transparent sort is applied to the transparent items list.'
  241. );
  242. } );
  243. QUnit.todo( 'finish', ( assert ) => {
  244. assert.ok( false, "everything's gonna be alright" );
  245. } );
  246. } );
  247. } );
  248. } );