CardboardEffect.js 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.CardboardEffect = function ( renderer ) {
  5. var _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );
  6. var _scene = new THREE.Scene();
  7. var _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };
  8. var _renderTarget = new THREE.WebGLRenderTarget( 512, 512, _params );
  9. _renderTarget.scissorTest = true;
  10. // Distortion Mesh ported from:
  11. // https://github.com/borismus/webvr-boilerplate/blob/master/src/distortion/barrel-distortion-fragment.js
  12. var distortion = new THREE.Vector2( 0.441, 0.156 );
  13. var geometry = new THREE.PlaneBufferGeometry( 1, 1, 10, 20 );
  14. var indices = geometry.index.array;
  15. var positions = geometry.attributes.position.array;
  16. var uvs = geometry.attributes.uv.array;
  17. var vector = new THREE.Vector2();
  18. function poly( val ) {
  19. return 1.5 + ( distortion.x + distortion.y * val ) * val;
  20. }
  21. for ( var i = 0; i < indices.length; i ++ ) {
  22. vector.x = positions[ i * 3 + 0 ];
  23. vector.y = positions[ i * 3 + 1 ];
  24. var scalar = poly( vector.dot( vector ) );
  25. positions[ i * 3 + 0 ] = ( vector.x / scalar ) * 1.5 - 0.5;
  26. positions[ i * 3 + 1 ] = ( vector.y / scalar ) * 3.0;
  27. uvs[ i * 2 ] *= 0.5;
  28. }
  29. // clone geometry
  30. function copyArray( array1, array2, offset ) {
  31. for ( var i = 0, l = array2.length; i < l; i ++ ) {
  32. array1[ i + offset ] = array2[ i ];
  33. }
  34. }
  35. var indices2 = new Uint16Array( indices.length * 2 );
  36. var positions2 = new Float32Array( positions.length * 2 );
  37. var uvs2 = new Float32Array( uvs.length * 2 );
  38. copyArray( indices2, indices, 0 );
  39. copyArray( positions2, positions, 0 );
  40. copyArray( uvs2, uvs, 0 );
  41. var offset = positions.length / 3;
  42. for ( i = 0; i < indices.length; i ++ ) {
  43. indices[ i ] += offset;
  44. positions[ i * 3 ] += 1.0;
  45. uvs[ i * 2 ] += 0.5;
  46. }
  47. copyArray( indices2, indices, indices.length );
  48. copyArray( positions2, positions, positions.length );
  49. copyArray( uvs2, uvs, uvs.length );
  50. var geometry2 = new THREE.BufferGeometry();
  51. geometry2.setIndex( new THREE.BufferAttribute( indices2, 1 ) );
  52. geometry2.addAttribute( 'position', new THREE.BufferAttribute( positions2, 3 ) );
  53. geometry2.addAttribute( 'uv', new THREE.BufferAttribute( uvs2, 2 ) );
  54. // var material = new THREE.MeshBasicMaterial( { wireframe: true } );
  55. var material = new THREE.MeshBasicMaterial( { map: _renderTarget } );
  56. var mesh = new THREE.Mesh( geometry2, material );
  57. _scene.add( mesh );
  58. //
  59. this.setSize = function ( width, height ) {
  60. _renderTarget.setSize( width, height );
  61. renderer.setSize( width, height );
  62. };
  63. this.render = function ( scene, camera ) {
  64. if ( camera instanceof THREE.StereoCamera === false ) {
  65. console.error( 'THREE.StereoCamera.render(): camera should now be an insteance of THREE.StereoCamera.' );
  66. return;
  67. }
  68. scene.updateMatrixWorld();
  69. if ( camera.parent === null ) camera.updateMatrixWorld();
  70. var width = _renderTarget.width / 2;
  71. var height = _renderTarget.height;
  72. _renderTarget.scissor.set( 0, 0, width, height );
  73. _renderTarget.viewport.set( 0, 0, width, height );
  74. renderer.render( scene, camera.cameraL, _renderTarget );
  75. _renderTarget.scissor.set( width, 0, width, height );
  76. _renderTarget.viewport.set( width, 0, width, height );
  77. renderer.render( scene, camera.cameraR, _renderTarget );
  78. renderer.render( _scene, _camera );
  79. };
  80. };