babylon.cameraInputsManager.js 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. var BABYLON;
  2. (function (BABYLON) {
  3. BABYLON.CameraInputTypes = {};
  4. var CameraInputsManager = (function () {
  5. function CameraInputsManager(camera) {
  6. this.attached = {};
  7. this.camera = camera;
  8. this.checkInputs = function () { };
  9. }
  10. CameraInputsManager.prototype.add = function (input) {
  11. var type = input.getSimpleName();
  12. if (this.attached[type]) {
  13. BABYLON.Tools.Warn("camera input of type " + type + " already exists on camera");
  14. return;
  15. }
  16. this.attached[type] = input;
  17. input.attachCamera(this.camera);
  18. //for checkInputs, we are dynamically creating a function
  19. //the goal is to avoid the performance penalty of looping for inputs in the render loop
  20. if (input.checkInputs) {
  21. this.checkInputs = this._addCheckInputs(input.checkInputs.bind(input));
  22. }
  23. };
  24. CameraInputsManager.prototype._addCheckInputs = function (fn) {
  25. var current = this.checkInputs;
  26. return function () {
  27. current();
  28. fn();
  29. };
  30. };
  31. CameraInputsManager.prototype.attachElement = function (element, noPreventDefault) {
  32. for (var cam in this.attached) {
  33. var input = this.attached[cam];
  34. if (input.attachElement)
  35. this.attached[cam].attachElement(element, noPreventDefault);
  36. }
  37. };
  38. CameraInputsManager.prototype.detachElement = function (element) {
  39. for (var cam in this.attached) {
  40. var input = this.attached[cam];
  41. if (input.detachElement)
  42. this.attached[cam].detachElement(element);
  43. }
  44. };
  45. CameraInputsManager.prototype.rebuildInputCheck = function (element) {
  46. this.checkInputs = function () { };
  47. for (var cam in this.attached) {
  48. var input = this.attached[cam];
  49. if (input.checkInputs) {
  50. this.checkInputs = this._addCheckInputs(input.checkInputs.bind(input));
  51. }
  52. }
  53. };
  54. CameraInputsManager.prototype.clear = function () {
  55. for (var cam in this.attached) {
  56. this.attached[cam].detach();
  57. }
  58. this.attached = {};
  59. this.checkInputs = function () { };
  60. };
  61. CameraInputsManager.prototype.serialize = function (serializedCamera) {
  62. var inputs = {};
  63. for (var cam in this.attached) {
  64. var input = this.attached[cam];
  65. var res = BABYLON.SerializationHelper.Serialize(input, serializedCamera);
  66. inputs[input.getTypeName()] = res;
  67. }
  68. serializedCamera.inputsmgr = inputs;
  69. };
  70. CameraInputsManager.prototype.parse = function (parsedCamera) {
  71. var parsedInputs = parsedCamera.inputsmgr;
  72. if (parsedInputs) {
  73. this.clear();
  74. for (var n in parsedInputs) {
  75. var construct = BABYLON.CameraInputTypes[n];
  76. if (construct) {
  77. var parsedinput = parsedInputs[n];
  78. var input = BABYLON.SerializationHelper.Parse(function () { return new construct(); }, parsedinput, null);
  79. this.add(input);
  80. }
  81. }
  82. }
  83. else {
  84. //2016-03-08 this part is for managing backward compatibility
  85. for (var n in this.attached) {
  86. var construct = BABYLON.CameraInputTypes[this.attached[n].getTypeName()];
  87. if (construct) {
  88. var input = BABYLON.SerializationHelper.Parse(function () { return new construct(); }, parsedCamera, null);
  89. this.add(input);
  90. }
  91. }
  92. }
  93. };
  94. return CameraInputsManager;
  95. })();
  96. BABYLON.CameraInputsManager = CameraInputsManager;
  97. })(BABYLON || (BABYLON = {}));