Box3.tests.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /**
  2. * @author bhouston / http://exocortex.com
  3. * @author TristanVALCKE / https://github.com/Itee
  4. */
  5. /* global QUnit */
  6. import { Box3 } from '../../../../src/math/Box3';
  7. import { Sphere } from '../../../../src/math/Sphere';
  8. import { Plane } from '../../../../src/math/Plane';
  9. import { Vector3 } from '../../../../src/math/Vector3';
  10. import { Matrix4 } from '../../../../src/math/Matrix4';
  11. import { Mesh } from '../../../../src/objects/Mesh';
  12. import { BufferAttribute } from '../../../../src/core/BufferAttribute';
  13. import {
  14. BoxGeometry,
  15. BoxBufferGeometry
  16. } from '../../../../src/geometries/BoxGeometry';
  17. import {
  18. negInf3,
  19. posInf3,
  20. zero3,
  21. one3,
  22. two3
  23. } from './Constants.tests';
  24. function compareBox( a, b, threshold ) {
  25. threshold = threshold || 0.0001;
  26. return ( a.min.distanceTo( b.min ) < threshold &&
  27. a.max.distanceTo( b.max ) < threshold );
  28. }
  29. export default QUnit.module( 'Maths', () => {
  30. QUnit.module.todo( 'Box3', () => {
  31. // INSTANCING
  32. QUnit.test( "Instancing", ( assert ) => {
  33. var a = new Box3();
  34. assert.ok( a.min.equals( posInf3 ), "Passed!" );
  35. assert.ok( a.max.equals( negInf3 ), "Passed!" );
  36. var a = new Box3( zero3.clone(), zero3.clone() );
  37. assert.ok( a.min.equals( zero3 ), "Passed!" );
  38. assert.ok( a.max.equals( zero3 ), "Passed!" );
  39. var a = new Box3( zero3.clone(), one3.clone() );
  40. assert.ok( a.min.equals( zero3 ), "Passed!" );
  41. assert.ok( a.max.equals( one3 ), "Passed!" );
  42. } );
  43. // PUBLIC STUFF
  44. QUnit.test( "isBox3", ( assert ) => {
  45. assert.ok( false, "everything's gonna be alright" );
  46. } );
  47. QUnit.test( "set", ( assert ) => {
  48. var a = new Box3();
  49. a.set( zero3, one3 );
  50. assert.ok( a.min.equals( zero3 ), "Passed!" );
  51. assert.ok( a.max.equals( one3 ), "Passed!" );
  52. } );
  53. QUnit.test( "setFromArray", ( assert ) => {
  54. assert.ok( false, "everything's gonna be alright" );
  55. } );
  56. QUnit.test( "setFromBufferAttribute", ( assert ) => {
  57. var a = new Box3( zero3.clone(), one3.clone() );
  58. var bigger = new BufferAttribute( new Float32Array( [
  59. - 2, - 2, - 2, 2, 2, 2, 1.5, 1.5, 1.5, 0, 0, 0
  60. ] ), 3 );
  61. var smaller = new BufferAttribute( new Float32Array( [
  62. - 0.5, - 0.5, - 0.5, 0.5, 0.5, 0.5, 0, 0, 0
  63. ] ), 3 );
  64. var newMin = new Vector3( - 2, - 2, - 2 );
  65. var newMax = new Vector3( 2, 2, 2 );
  66. a.setFromBufferAttribute( bigger );
  67. assert.ok( a.min.equals( newMin ), "Bigger box: correct new minimum" );
  68. assert.ok( a.max.equals( newMax ), "Bigger box: correct new maximum" );
  69. newMin.set( - 0.5, - 0.5, - 0.5 );
  70. newMax.set( 0.5, 0.5, 0.5 );
  71. a.setFromBufferAttribute( smaller );
  72. assert.ok( a.min.equals( newMin ), "Smaller box: correct new minimum" );
  73. assert.ok( a.max.equals( newMax ), "Smaller box: correct new maximum" );
  74. } );
  75. QUnit.test( "setFromPoints", ( assert ) => {
  76. var a = new Box3();
  77. a.setFromPoints( [ zero3, one3, two3 ] );
  78. assert.ok( a.min.equals( zero3 ), "Passed!" );
  79. assert.ok( a.max.equals( two3 ), "Passed!" );
  80. a.setFromPoints( [ one3 ] );
  81. assert.ok( a.min.equals( one3 ), "Passed!" );
  82. assert.ok( a.max.equals( one3 ), "Passed!" );
  83. a.setFromPoints( [] );
  84. assert.ok( a.isEmpty(), "Passed!" );
  85. } );
  86. QUnit.test( "setFromCenterAndSize", ( assert ) => {
  87. var a = new Box3( zero3.clone(), one3.clone() );
  88. var b = a.clone();
  89. var newCenter = one3;
  90. var newSize = two3;
  91. a.setFromCenterAndSize( a.getCenter(), a.getSize() );
  92. assert.ok( a.equals( b ), "Same values: no changes" );
  93. a.setFromCenterAndSize( newCenter, a.getSize() );
  94. assert.ok( a.getCenter().equals( newCenter ), "Move center: correct new center" );
  95. assert.ok( a.getSize().equals( b.getSize() ), "Move center: no change in size" );
  96. assert.notOk( a.equals( b ), "Move center: no longer equal to old values" );
  97. a.setFromCenterAndSize( a.getCenter(), newSize );
  98. assert.ok( a.getCenter().equals( newCenter ), "Resize: no change to center" );
  99. assert.ok( a.getSize().equals( newSize ), "Resize: correct new size" );
  100. assert.notOk( a.equals( b ), "Resize: no longer equal to old values" );
  101. } );
  102. QUnit.test( "setFromObject/BufferGeometry", ( assert ) => {
  103. var a = new Box3( zero3.clone(), one3.clone() );
  104. var object = new Mesh( new BoxBufferGeometry( 2, 2, 2 ) );
  105. var child = new Mesh( new BoxBufferGeometry( 1, 1, 1 ) );
  106. object.add( child );
  107. a.setFromObject( object );
  108. assert.ok( a.min.equals( new Vector3( - 1, - 1, - 1 ) ), "Correct new minimum" );
  109. assert.ok( a.max.equals( new Vector3( 1, 1, 1 ) ), "Correct new maximum" );
  110. } );
  111. QUnit.test( "clone", ( assert ) => {
  112. assert.ok( false, "everything's gonna be alright" );
  113. } );
  114. QUnit.test( "copy", ( assert ) => {
  115. var a = new Box3( zero3.clone(), one3.clone() );
  116. var b = new Box3().copy( a );
  117. assert.ok( b.min.equals( zero3 ), "Passed!" );
  118. assert.ok( b.max.equals( one3 ), "Passed!" );
  119. // ensure that it is a true copy
  120. a.min = zero3;
  121. a.max = one3;
  122. assert.ok( b.min.equals( zero3 ), "Passed!" );
  123. assert.ok( b.max.equals( one3 ), "Passed!" );
  124. } );
  125. QUnit.test( "empty/makeEmpty", ( assert ) => {
  126. var a = new Box3();
  127. assert.ok( a.isEmpty(), "Passed!" );
  128. var a = new Box3( zero3.clone(), one3.clone() );
  129. assert.ok( ! a.isEmpty(), "Passed!" );
  130. a.makeEmpty();
  131. assert.ok( a.isEmpty(), "Passed!" );
  132. } );
  133. QUnit.test( "isEmpty", ( assert ) => {
  134. assert.ok( false, "everything's gonna be alright" );
  135. } );
  136. QUnit.test( "getCenter", ( assert ) => {
  137. var a = new Box3( zero3.clone(), zero3.clone() );
  138. assert.ok( a.getCenter().equals( zero3 ), "Passed!" );
  139. var a = new Box3( zero3.clone(), one3.clone() );
  140. var midpoint = one3.clone().multiplyScalar( 0.5 );
  141. assert.ok( a.getCenter().equals( midpoint ), "Passed!" );
  142. } );
  143. QUnit.test( "getSize", ( assert ) => {
  144. var a = new Box3( zero3.clone(), zero3.clone() );
  145. assert.ok( a.getSize().equals( zero3 ), "Passed!" );
  146. var a = new Box3( zero3.clone(), one3.clone() );
  147. assert.ok( a.getSize().equals( one3 ), "Passed!" );
  148. } );
  149. QUnit.test( "expandByPoint", ( assert ) => {
  150. var a = new Box3( zero3.clone(), zero3.clone() );
  151. a.expandByPoint( zero3 );
  152. assert.ok( a.getSize().equals( zero3 ), "Passed!" );
  153. a.expandByPoint( one3 );
  154. assert.ok( a.getSize().equals( one3 ), "Passed!" );
  155. a.expandByPoint( one3.clone().negate() );
  156. assert.ok( a.getSize().equals( one3.clone().multiplyScalar( 2 ) ), "Passed!" );
  157. assert.ok( a.getCenter().equals( zero3 ), "Passed!" );
  158. } );
  159. QUnit.test( "expandByVector", ( assert ) => {
  160. var a = new Box3( zero3.clone(), zero3.clone() );
  161. a.expandByVector( zero3 );
  162. assert.ok( a.getSize().equals( zero3 ), "Passed!" );
  163. a.expandByVector( one3 );
  164. assert.ok( a.getSize().equals( one3.clone().multiplyScalar( 2 ) ), "Passed!" );
  165. assert.ok( a.getCenter().equals( zero3 ), "Passed!" );
  166. } );
  167. QUnit.test( "expandByScalar", ( assert ) => {
  168. var a = new Box3( zero3.clone(), zero3.clone() );
  169. a.expandByScalar( 0 );
  170. assert.ok( a.getSize().equals( zero3 ), "Passed!" );
  171. a.expandByScalar( 1 );
  172. assert.ok( a.getSize().equals( one3.clone().multiplyScalar( 2 ) ), "Passed!" );
  173. assert.ok( a.getCenter().equals( zero3 ), "Passed!" );
  174. } );
  175. QUnit.test( "expandByObject", ( assert ) => {
  176. var a = new Box3( zero3.clone(), one3.clone() );
  177. var b = a.clone();
  178. var bigger = new Mesh( new BoxGeometry( 2, 2, 2 ) );
  179. var smaller = new Mesh( new BoxGeometry( 0.5, 0.5, 0.5 ) );
  180. var child = new Mesh( new BoxGeometry( 1, 1, 1 ) );
  181. // just a bigger box to begin with
  182. a.expandByObject( bigger );
  183. assert.ok( a.min.equals( new Vector3( - 1, - 1, - 1 ) ), "Bigger box: correct new minimum" );
  184. assert.ok( a.max.equals( new Vector3( 1, 1, 1 ) ), "Bigger box: correct new maximum" );
  185. // a translated, bigger box
  186. a.copy( b );
  187. bigger.translateX( 2 );
  188. a.expandByObject( bigger );
  189. assert.ok( a.min.equals( new Vector3( 0, - 1, - 1 ) ), "Translated, bigger box: correct new minimum" );
  190. assert.ok( a.max.equals( new Vector3( 3, 1, 1 ) ), "Translated, bigger box: correct new maximum" );
  191. // a translated, bigger box with child
  192. a.copy( b );
  193. bigger.add( child );
  194. a.expandByObject( bigger );
  195. assert.ok( a.min.equals( new Vector3( 0, - 1, - 1 ) ), "Translated, bigger box with child: correct new minimum" );
  196. assert.ok( a.max.equals( new Vector3( 3, 1, 1 ) ), "Translated, bigger box with child: correct new maximum" );
  197. // a translated, bigger box with a translated child
  198. a.copy( b );
  199. child.translateX( 2 );
  200. a.expandByObject( bigger );
  201. assert.ok( a.min.equals( new Vector3( 0, - 1, - 1 ) ), "Translated, bigger box with translated child: correct new minimum" );
  202. assert.ok( a.max.equals( new Vector3( 4.5, 1, 1 ) ), "Translated, bigger box with translated child: correct new maximum" );
  203. // a smaller box
  204. a.copy( b );
  205. a.expandByObject( smaller );
  206. assert.ok( a.min.equals( new Vector3( - 0.25, - 0.25, - 0.25 ) ), "Smaller box: correct new minimum" );
  207. assert.ok( a.max.equals( new Vector3( 1, 1, 1 ) ), "Smaller box: correct new maximum" );
  208. } );
  209. QUnit.test( "containsPoint", ( assert ) => {
  210. var a = new Box3( zero3.clone(), zero3.clone() );
  211. assert.ok( a.containsPoint( zero3 ), "Passed!" );
  212. assert.ok( ! a.containsPoint( one3 ), "Passed!" );
  213. a.expandByScalar( 1 );
  214. assert.ok( a.containsPoint( zero3 ), "Passed!" );
  215. assert.ok( a.containsPoint( one3 ), "Passed!" );
  216. assert.ok( a.containsPoint( one3.clone().negate() ), "Passed!" );
  217. } );
  218. QUnit.test( "containsBox", ( assert ) => {
  219. var a = new Box3( zero3.clone(), zero3.clone() );
  220. var b = new Box3( zero3.clone(), one3.clone() );
  221. var c = new Box3( one3.clone().negate(), one3.clone() );
  222. assert.ok( a.containsBox( a ), "Passed!" );
  223. assert.ok( ! a.containsBox( b ), "Passed!" );
  224. assert.ok( ! a.containsBox( c ), "Passed!" );
  225. assert.ok( b.containsBox( a ), "Passed!" );
  226. assert.ok( c.containsBox( a ), "Passed!" );
  227. assert.ok( ! b.containsBox( c ), "Passed!" );
  228. } );
  229. QUnit.test( "getParameter", ( assert ) => {
  230. var a = new Box3( zero3.clone(), one3.clone() );
  231. var b = new Box3( one3.clone().negate(), one3.clone() );
  232. assert.ok( a.getParameter( new Vector3( 0, 0, 0 ) ).equals( new Vector3( 0, 0, 0 ) ), "Passed!" );
  233. assert.ok( a.getParameter( new Vector3( 1, 1, 1 ) ).equals( new Vector3( 1, 1, 1 ) ), "Passed!" );
  234. assert.ok( b.getParameter( new Vector3( - 1, - 1, - 1 ) ).equals( new Vector3( 0, 0, 0 ) ), "Passed!" );
  235. assert.ok( b.getParameter( new Vector3( 0, 0, 0 ) ).equals( new Vector3( 0.5, 0.5, 0.5 ) ), "Passed!" );
  236. assert.ok( b.getParameter( new Vector3( 1, 1, 1 ) ).equals( new Vector3( 1, 1, 1 ) ), "Passed!" );
  237. } );
  238. QUnit.test( "intersectsBox", ( assert ) => {
  239. var a = new Box3( zero3.clone(), zero3.clone() );
  240. var b = new Box3( zero3.clone(), one3.clone() );
  241. var c = new Box3( one3.clone().negate(), one3.clone() );
  242. assert.ok( a.intersectsBox( a ), "Passed!" );
  243. assert.ok( a.intersectsBox( b ), "Passed!" );
  244. assert.ok( a.intersectsBox( c ), "Passed!" );
  245. assert.ok( b.intersectsBox( a ), "Passed!" );
  246. assert.ok( c.intersectsBox( a ), "Passed!" );
  247. assert.ok( b.intersectsBox( c ), "Passed!" );
  248. b.translate( new Vector3( 2, 2, 2 ) );
  249. assert.ok( ! a.intersectsBox( b ), "Passed!" );
  250. assert.ok( ! b.intersectsBox( a ), "Passed!" );
  251. assert.ok( ! b.intersectsBox( c ), "Passed!" );
  252. } );
  253. QUnit.test( "intersectsSphere", ( assert ) => {
  254. var a = new Box3( zero3.clone(), one3.clone() );
  255. var b = new Sphere( zero3.clone(), 1 );
  256. assert.ok( a.intersectsSphere( b ), "Passed!" );
  257. b.translate( new Vector3( 2, 2, 2 ) );
  258. assert.ok( ! a.intersectsSphere( b ), "Passed!" );
  259. } );
  260. QUnit.test( "intersectsPlane", ( assert ) => {
  261. var a = new Box3( zero3.clone(), one3.clone() );
  262. var b = new Plane( new Vector3( 0, 1, 0 ), 1 );
  263. var c = new Plane( new Vector3( 0, 1, 0 ), 1.25 );
  264. var d = new Plane( new Vector3( 0, - 1, 0 ), 1.25 );
  265. assert.ok( a.intersectsPlane( b ), "Passed!" );
  266. assert.ok( ! a.intersectsPlane( c ), "Passed!" );
  267. assert.ok( ! a.intersectsPlane( d ), "Passed!" );
  268. } );
  269. QUnit.test( "clampPoint", ( assert ) => {
  270. var a = new Box3( zero3.clone(), zero3.clone() );
  271. var b = new Box3( one3.clone().negate(), one3.clone() );
  272. assert.ok( a.clampPoint( new Vector3( 0, 0, 0 ) ).equals( new Vector3( 0, 0, 0 ) ), "Passed!" );
  273. assert.ok( a.clampPoint( new Vector3( 1, 1, 1 ) ).equals( new Vector3( 0, 0, 0 ) ), "Passed!" );
  274. assert.ok( a.clampPoint( new Vector3( - 1, - 1, - 1 ) ).equals( new Vector3( 0, 0, 0 ) ), "Passed!" );
  275. assert.ok( b.clampPoint( new Vector3( 2, 2, 2 ) ).equals( new Vector3( 1, 1, 1 ) ), "Passed!" );
  276. assert.ok( b.clampPoint( new Vector3( 1, 1, 1 ) ).equals( new Vector3( 1, 1, 1 ) ), "Passed!" );
  277. assert.ok( b.clampPoint( new Vector3( 0, 0, 0 ) ).equals( new Vector3( 0, 0, 0 ) ), "Passed!" );
  278. assert.ok( b.clampPoint( new Vector3( - 1, - 1, - 1 ) ).equals( new Vector3( - 1, - 1, - 1 ) ), "Passed!" );
  279. assert.ok( b.clampPoint( new Vector3( - 2, - 2, - 2 ) ).equals( new Vector3( - 1, - 1, - 1 ) ), "Passed!" );
  280. } );
  281. QUnit.test( "distanceToPoint", ( assert ) => {
  282. var a = new Box3( zero3.clone(), zero3.clone() );
  283. var b = new Box3( one3.clone().negate(), one3.clone() );
  284. assert.ok( a.distanceToPoint( new Vector3( 0, 0, 0 ) ) == 0, "Passed!" );
  285. assert.ok( a.distanceToPoint( new Vector3( 1, 1, 1 ) ) == Math.sqrt( 3 ), "Passed!" );
  286. assert.ok( a.distanceToPoint( new Vector3( - 1, - 1, - 1 ) ) == Math.sqrt( 3 ), "Passed!" );
  287. assert.ok( b.distanceToPoint( new Vector3( 2, 2, 2 ) ) == Math.sqrt( 3 ), "Passed!" );
  288. assert.ok( b.distanceToPoint( new Vector3( 1, 1, 1 ) ) == 0, "Passed!" );
  289. assert.ok( b.distanceToPoint( new Vector3( 0, 0, 0 ) ) == 0, "Passed!" );
  290. assert.ok( b.distanceToPoint( new Vector3( - 1, - 1, - 1 ) ) == 0, "Passed!" );
  291. assert.ok( b.distanceToPoint( new Vector3( - 2, - 2, - 2 ) ) == Math.sqrt( 3 ), "Passed!" );
  292. } );
  293. QUnit.test( "getBoundingSphere", ( assert ) => {
  294. var a = new Box3( zero3.clone(), zero3.clone() );
  295. var b = new Box3( zero3.clone(), one3.clone() );
  296. var c = new Box3( one3.clone().negate(), one3.clone() );
  297. assert.ok( a.getBoundingSphere().equals( new Sphere( zero3, 0 ) ), "Passed!" );
  298. assert.ok( b.getBoundingSphere().equals( new Sphere( one3.clone().multiplyScalar( 0.5 ), Math.sqrt( 3 ) * 0.5 ) ), "Passed!" );
  299. assert.ok( c.getBoundingSphere().equals( new Sphere( zero3, Math.sqrt( 12 ) * 0.5 ) ), "Passed!" );
  300. } );
  301. QUnit.test( "intersect", ( assert ) => {
  302. var a = new Box3( zero3.clone(), zero3.clone() );
  303. var b = new Box3( zero3.clone(), one3.clone() );
  304. var c = new Box3( one3.clone().negate(), one3.clone() );
  305. assert.ok( a.clone().intersect( a ).equals( a ), "Passed!" );
  306. assert.ok( a.clone().intersect( b ).equals( a ), "Passed!" );
  307. assert.ok( b.clone().intersect( b ).equals( b ), "Passed!" );
  308. assert.ok( a.clone().intersect( c ).equals( a ), "Passed!" );
  309. assert.ok( b.clone().intersect( c ).equals( b ), "Passed!" );
  310. assert.ok( c.clone().intersect( c ).equals( c ), "Passed!" );
  311. } );
  312. QUnit.test( "union", ( assert ) => {
  313. var a = new Box3( zero3.clone(), zero3.clone() );
  314. var b = new Box3( zero3.clone(), one3.clone() );
  315. var c = new Box3( one3.clone().negate(), one3.clone() );
  316. assert.ok( a.clone().union( a ).equals( a ), "Passed!" );
  317. assert.ok( a.clone().union( b ).equals( b ), "Passed!" );
  318. assert.ok( a.clone().union( c ).equals( c ), "Passed!" );
  319. assert.ok( b.clone().union( c ).equals( c ), "Passed!" );
  320. } );
  321. QUnit.test( "applyMatrix4", ( assert ) => {
  322. var a = new Box3( zero3.clone(), zero3.clone() );
  323. var b = new Box3( zero3.clone(), one3.clone() );
  324. var c = new Box3( one3.clone().negate(), one3.clone() );
  325. var d = new Box3( one3.clone().negate(), zero3.clone() );
  326. var m = new Matrix4().makeTranslation( 1, - 2, 1 );
  327. var t1 = new Vector3( 1, - 2, 1 );
  328. assert.ok( compareBox( a.clone().applyMatrix4( m ), a.clone().translate( t1 ) ), "Passed!" );
  329. assert.ok( compareBox( b.clone().applyMatrix4( m ), b.clone().translate( t1 ) ), "Passed!" );
  330. assert.ok( compareBox( c.clone().applyMatrix4( m ), c.clone().translate( t1 ) ), "Passed!" );
  331. assert.ok( compareBox( d.clone().applyMatrix4( m ), d.clone().translate( t1 ) ), "Passed!" );
  332. } );
  333. QUnit.test( "translate", ( assert ) => {
  334. var a = new Box3( zero3.clone(), zero3.clone() );
  335. var b = new Box3( zero3.clone(), one3.clone() );
  336. var c = new Box3( one3.clone().negate(), one3.clone() );
  337. var d = new Box3( one3.clone().negate(), zero3.clone() );
  338. assert.ok( a.clone().translate( one3 ).equals( new Box3( one3, one3 ) ), "Passed!" );
  339. assert.ok( a.clone().translate( one3 ).translate( one3.clone().negate() ).equals( a ), "Passed!" );
  340. assert.ok( d.clone().translate( one3 ).equals( b ), "Passed!" );
  341. assert.ok( b.clone().translate( one3.clone().negate() ).equals( d ), "Passed!" );
  342. } );
  343. QUnit.test( "equals", ( assert ) => {
  344. assert.ok( false, "everything's gonna be alright" );
  345. } );
  346. } );
  347. } );