Player.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. var Player = function ( editor ) {
  2. var signals = editor.signals;
  3. var container = new UI.Panel();
  4. container.setPosition( 'absolute' );
  5. container.setDisplay( 'none' );
  6. //
  7. var camera, scene, renderer;
  8. var scripts;
  9. //
  10. var load = function ( json ) {
  11. renderer = new THREE.WebGLRenderer( { antialias: true } );
  12. renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight );
  13. container.dom.appendChild( renderer.domElement );
  14. camera = editor.camera.clone();
  15. scene = new THREE.ObjectLoader().parse( json );
  16. //
  17. scripts = [];
  18. scene.traverse( function ( child ) {
  19. if ( child.script !== undefined ) {
  20. var script = new Function( 'scene', 'time', child.script.source ).bind( child );
  21. scripts.push( script );
  22. }
  23. } );
  24. };
  25. var request;
  26. var play = function () {
  27. request = requestAnimationFrame( play );
  28. update();
  29. render();
  30. };
  31. var stop = function () {
  32. cancelAnimationFrame( request );
  33. if ( renderer !== undefined ) {
  34. container.dom.removeChild( renderer.domElement );
  35. }
  36. };
  37. var render = function () {
  38. renderer.render( scene, camera );
  39. };
  40. var update = function () {
  41. var time = performance.now();
  42. for ( var i = 0; i < scripts.length; i ++ ) {
  43. scripts[ i ]( scene, time );
  44. }
  45. render();
  46. };
  47. signals.startPlayer.add( function ( json ) {
  48. container.setDisplay( '' );
  49. load( json );
  50. play();
  51. } );
  52. signals.stopPlayer.add( function () {
  53. container.setDisplay( 'none' );
  54. stop();
  55. } );
  56. return container;
  57. };