DebugEnvironment.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import {
  2. BackSide,
  3. BoxGeometry,
  4. Mesh,
  5. MeshLambertMaterial,
  6. MeshStandardMaterial,
  7. PointLight,
  8. Scene,
  9. } from 'three';
  10. /**
  11. * This class represents a scene with a very basic room setup that can be used as
  12. * input for {@link PMREMGenerator#fromScene}. The resulting PMREM represents the room's
  13. * lighting and can be used for Image Based Lighting by assigning it to {@link Scene#environment}
  14. * or directly as an environment map to PBR materials.
  15. *
  16. * This class uses a simple room setup and should only be used for development purposes.
  17. * A more appropriate setup for production is {@link RoomEnvironment}.
  18. *
  19. * ```js
  20. * const environment = new DebugEnvironment();
  21. * const pmremGenerator = new THREE.PMREMGenerator( renderer );
  22. *
  23. * const envMap = pmremGenerator.fromScene( environment ).texture;
  24. * scene.environment = envMap;
  25. * ```
  26. *
  27. * @augments Scene
  28. * @three_import import { DebugEnvironment } from 'three/addons/environments/DebugEnvironment.js';
  29. */
  30. class DebugEnvironment extends Scene {
  31. /**
  32. * Constructs a new debug environment.
  33. */
  34. constructor() {
  35. super();
  36. const geometry = new BoxGeometry();
  37. geometry.deleteAttribute( 'uv' );
  38. const roomMaterial = new MeshStandardMaterial( { metalness: 0, side: BackSide } );
  39. const room = new Mesh( geometry, roomMaterial );
  40. room.scale.setScalar( 10 );
  41. this.add( room );
  42. const mainLight = new PointLight( 0xffffff, 50, 0, 2 );
  43. this.add( mainLight );
  44. const material1 = new MeshLambertMaterial( { color: 0xff0000, emissive: 0xffffff, emissiveIntensity: 10 } );
  45. const light1 = new Mesh( geometry, material1 );
  46. light1.position.set( - 5, 2, 0 );
  47. light1.scale.set( 0.1, 1, 1 );
  48. this.add( light1 );
  49. const material2 = new MeshLambertMaterial( { color: 0x00ff00, emissive: 0xffffff, emissiveIntensity: 10 } );
  50. const light2 = new Mesh( geometry, material2 );
  51. light2.position.set( 0, 5, 0 );
  52. light2.scale.set( 1, 0.1, 1 );
  53. this.add( light2 );
  54. const material3 = new MeshLambertMaterial( { color: 0x0000ff, emissive: 0xffffff, emissiveIntensity: 10 } );
  55. const light3 = new Mesh( geometry, material3 );
  56. light3.position.set( 2, 1, 5 );
  57. light3.scale.set( 1.5, 2, 0.1 );
  58. this.add( light3 );
  59. }
  60. /**
  61. * Frees internal resources. This method should be called
  62. * when the environment is no longer required.
  63. */
  64. dispose() {
  65. const resources = new Set();
  66. this.traverse( ( object ) => {
  67. if ( object.isMesh ) {
  68. resources.add( object.geometry );
  69. resources.add( object.material );
  70. }
  71. } );
  72. for ( const resource of resources ) {
  73. resource.dispose();
  74. }
  75. }
  76. }
  77. export { DebugEnvironment };