Player.js 1.4 KB

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