StereoEffect.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import {
  2. StereoCamera,
  3. Vector2
  4. } from 'three';
  5. /**
  6. * A class that creates an stereo effect.
  7. *
  8. * Note that this class can only be used with {@link WebGLRenderer}.
  9. * When using {@link WebGPURenderer}, use {@link StereoPassNode}.
  10. *
  11. * @three_import import { StereoEffect } from 'three/addons/effects/StereoEffect.js';
  12. */
  13. class StereoEffect {
  14. /**
  15. * Constructs a new stereo effect.
  16. *
  17. * @param {WebGLRenderer} renderer - The renderer.
  18. */
  19. constructor( renderer ) {
  20. const _stereo = new StereoCamera();
  21. _stereo.aspect = 0.5;
  22. const size = new Vector2();
  23. /**
  24. * Sets the given eye separation.
  25. *
  26. * @param {number} eyeSep - The eye separation to set.
  27. */
  28. this.setEyeSeparation = function ( eyeSep ) {
  29. _stereo.eyeSep = eyeSep;
  30. };
  31. /**
  32. * Resizes the effect.
  33. *
  34. * @param {number} width - The width of the effect in logical pixels.
  35. * @param {number} height - The height of the effect in logical pixels.
  36. */
  37. this.setSize = function ( width, height ) {
  38. renderer.setSize( width, height );
  39. };
  40. /**
  41. * When using this effect, this method should be called instead of the
  42. * default {@link WebGLRenderer#render}.
  43. *
  44. * @param {Object3D} scene - The scene to render.
  45. * @param {Camera} camera - The camera.
  46. */
  47. this.render = function ( scene, camera ) {
  48. if ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();
  49. if ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();
  50. _stereo.update( camera );
  51. const currentAutoClear = renderer.autoClear;
  52. renderer.getSize( size );
  53. renderer.autoClear = false;
  54. renderer.clear();
  55. renderer.setScissorTest( true );
  56. renderer.setScissor( 0, 0, size.width / 2, size.height );
  57. renderer.setViewport( 0, 0, size.width / 2, size.height );
  58. renderer.render( scene, _stereo.cameraL );
  59. renderer.setScissor( size.width / 2, 0, size.width / 2, size.height );
  60. renderer.setViewport( size.width / 2, 0, size.width / 2, size.height );
  61. renderer.render( scene, _stereo.cameraR );
  62. renderer.setScissorTest( false );
  63. renderer.autoClear = currentAutoClear;
  64. };
  65. }
  66. }
  67. export { StereoEffect };