app.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. var APP = {
  5. Player: function () {
  6. var loader = new THREE.ObjectLoader();
  7. var camera, scene, renderer;
  8. var scripts = {};
  9. this.dom = undefined;
  10. this.width = 500;
  11. this.height = 500;
  12. this.load = function ( json ) {
  13. renderer = new THREE.WebGLRenderer( { antialias: true } );
  14. renderer.setPixelRatio( window.devicePixelRatio );
  15. camera = loader.parse( json.camera );
  16. scene = loader.parse( json.scene );
  17. scripts = {
  18. keydown: [],
  19. keyup: [],
  20. mousedown: [],
  21. mouseup: [],
  22. mousemove: [],
  23. update: []
  24. };
  25. for ( var uuid in json.scripts ) {
  26. var object = scene.getObjectByProperty( 'uuid', uuid, true );
  27. var sources = json.scripts[ uuid ];
  28. for ( var i = 0; i < sources.length; i ++ ) {
  29. var script = sources[ i ];
  30. var events = ( new Function( 'player', 'scene', 'keydown', 'keyup', 'mousedown', 'mouseup', 'mousemove', 'update', script.source + '\nreturn { keydown: keydown, keyup: keyup, mousedown: mousedown, mouseup: mouseup, mousemove: mousemove, update: update };' ).bind( object ) )( this, scene );
  31. for ( var name in events ) {
  32. if ( events[ name ] === undefined ) continue;
  33. if ( scripts[ name ] === undefined ) {
  34. console.warn( 'APP.Player: event type not supported (', name, ')' );
  35. continue;
  36. }
  37. scripts[ name ].push( events[ name ].bind( object ) );
  38. }
  39. }
  40. }
  41. this.dom = renderer.domElement;
  42. };
  43. this.setCamera = function ( value ) {
  44. camera = value;
  45. camera.aspect = this.width / this.height;
  46. camera.updateProjectionMatrix();
  47. };
  48. this.setSize = function ( width, height ) {
  49. this.width = width;
  50. this.height = height;
  51. camera.aspect = this.width / this.height;
  52. camera.updateProjectionMatrix();
  53. renderer.setSize( width, height );
  54. };
  55. var dispatch = function ( array, event ) {
  56. for ( var i = 0, l = array.length; i < l; i ++ ) {
  57. array[ i ]( event );
  58. }
  59. };
  60. var request;
  61. var animate = function ( time ) {
  62. request = requestAnimationFrame( animate );
  63. dispatch( scripts.update, { time: time } );
  64. renderer.render( scene, camera );
  65. };
  66. this.play = function () {
  67. document.addEventListener( 'keydown', onDocumentKeyDown );
  68. document.addEventListener( 'keyup', onDocumentKeyUp );
  69. document.addEventListener( 'mousedown', onDocumentMouseDown );
  70. document.addEventListener( 'mouseup', onDocumentMouseUp );
  71. document.addEventListener( 'mousemove', onDocumentMouseMove );
  72. request = requestAnimationFrame( animate );
  73. };
  74. this.stop = function () {
  75. document.removeEventListener( 'keydown', onDocumentKeyDown );
  76. document.removeEventListener( 'keyup', onDocumentKeyUp );
  77. document.removeEventListener( 'mousedown', onDocumentMouseDown );
  78. document.removeEventListener( 'mouseup', onDocumentMouseUp );
  79. document.removeEventListener( 'mousemove', onDocumentMouseMove );
  80. cancelAnimationFrame( request );
  81. };
  82. //
  83. var onDocumentKeyDown = function ( event ) {
  84. dispatch( scripts.keydown, event );
  85. };
  86. var onDocumentKeyUp = function ( event ) {
  87. dispatch( scripts.keyup, event );
  88. };
  89. var onDocumentMouseDown = function ( event ) {
  90. dispatch( scripts.mousedown, event );
  91. };
  92. var onDocumentMouseUp = function ( event ) {
  93. dispatch( scripts.mouseup, event );
  94. };
  95. var onDocumentMouseMove = function ( event ) {
  96. dispatch( scripts.mousemove, event );
  97. };
  98. }
  99. };