CSS2DRenderer.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. console.warn( "THREE.CSS2DRenderer: As part of the transition to ES6 Modules, the files in 'examples/js' were deprecated in May 2020 (r117) and will be deleted in December 2020 (r124). You can find more information about developing using ES6 Modules in https://threejs.org/docs/index.html#manual/en/introduction/Import-via-modules." );
  2. /**
  3. * @author mrdoob / http://mrdoob.com/
  4. */
  5. THREE.CSS2DObject = function ( element ) {
  6. THREE.Object3D.call( this );
  7. this.element = element;
  8. this.element.style.position = 'absolute';
  9. this.addEventListener( 'removed', function () {
  10. this.traverse( function ( object ) {
  11. if ( object.element instanceof Element && object.element.parentNode !== null ) {
  12. object.element.parentNode.removeChild( object.element );
  13. }
  14. } );
  15. } );
  16. };
  17. THREE.CSS2DObject.prototype = Object.create( THREE.Object3D.prototype );
  18. THREE.CSS2DObject.prototype.constructor = THREE.CSS2DObject;
  19. //
  20. THREE.CSS2DRenderer = function () {
  21. var _this = this;
  22. var _width, _height;
  23. var _widthHalf, _heightHalf;
  24. var vector = new THREE.Vector3();
  25. var viewMatrix = new THREE.Matrix4();
  26. var viewProjectionMatrix = new THREE.Matrix4();
  27. var cache = {
  28. objects: new WeakMap()
  29. };
  30. var domElement = document.createElement( 'div' );
  31. domElement.style.overflow = 'hidden';
  32. this.domElement = domElement;
  33. this.getSize = function () {
  34. return {
  35. width: _width,
  36. height: _height
  37. };
  38. };
  39. this.setSize = function ( width, height ) {
  40. _width = width;
  41. _height = height;
  42. _widthHalf = _width / 2;
  43. _heightHalf = _height / 2;
  44. domElement.style.width = width + 'px';
  45. domElement.style.height = height + 'px';
  46. };
  47. var renderObject = function ( object, scene, camera ) {
  48. if ( object instanceof THREE.CSS2DObject ) {
  49. object.onBeforeRender( _this, scene, camera );
  50. vector.setFromMatrixPosition( object.matrixWorld );
  51. vector.applyMatrix4( viewProjectionMatrix );
  52. var element = object.element;
  53. var style = 'translate(-50%,-50%) translate(' + ( vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - vector.y * _heightHalf + _heightHalf ) + 'px)';
  54. element.style.WebkitTransform = style;
  55. element.style.MozTransform = style;
  56. element.style.oTransform = style;
  57. element.style.transform = style;
  58. element.style.display = ( object.visible && vector.z >= - 1 && vector.z <= 1 ) ? '' : 'none';
  59. var objectData = {
  60. distanceToCameraSquared: getDistanceToSquared( camera, object )
  61. };
  62. cache.objects.set( object, objectData );
  63. if ( element.parentNode !== domElement ) {
  64. domElement.appendChild( element );
  65. }
  66. object.onAfterRender( _this, scene, camera );
  67. }
  68. for ( var i = 0, l = object.children.length; i < l; i ++ ) {
  69. renderObject( object.children[ i ], scene, camera );
  70. }
  71. };
  72. var getDistanceToSquared = function () {
  73. var a = new THREE.Vector3();
  74. var b = new THREE.Vector3();
  75. return function ( object1, object2 ) {
  76. a.setFromMatrixPosition( object1.matrixWorld );
  77. b.setFromMatrixPosition( object2.matrixWorld );
  78. return a.distanceToSquared( b );
  79. };
  80. }();
  81. var filterAndFlatten = function ( scene ) {
  82. var result = [];
  83. scene.traverse( function ( object ) {
  84. if ( object instanceof THREE.CSS2DObject ) result.push( object );
  85. } );
  86. return result;
  87. };
  88. var zOrder = function ( scene ) {
  89. var sorted = filterAndFlatten( scene ).sort( function ( a, b ) {
  90. var distanceA = cache.objects.get( a ).distanceToCameraSquared;
  91. var distanceB = cache.objects.get( b ).distanceToCameraSquared;
  92. return distanceA - distanceB;
  93. } );
  94. var zMax = sorted.length;
  95. for ( var i = 0, l = sorted.length; i < l; i ++ ) {
  96. sorted[ i ].element.style.zIndex = zMax - i;
  97. }
  98. };
  99. this.render = function ( scene, camera ) {
  100. if ( scene.autoUpdate === true ) scene.updateMatrixWorld();
  101. if ( camera.parent === null ) camera.updateMatrixWorld();
  102. viewMatrix.copy( camera.matrixWorldInverse );
  103. viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, viewMatrix );
  104. renderObject( scene, scene, camera );
  105. zOrder( scene );
  106. };
  107. };