Renderer.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. "use strict";
  2. /**
  3. * The renderer is resposible for drawing the structure into the canvas element.
  4. *
  5. * Its also resposible for managing the canvas state.
  6. *
  7. * @class
  8. */
  9. function Renderer(canvas)
  10. {
  11. /**
  12. * Canvas DOM element, has to be managed by the user.
  13. */
  14. this.canvas = canvas;
  15. /**
  16. * Canvas 2D rendering context used to draw content.
  17. */
  18. this.context = canvas.getContext("2d");
  19. this.context.imageSmoothingEnabled = true;
  20. this.context.globalCompositeOperation = "source-over";
  21. /**
  22. * Mouse input handler object.
  23. */
  24. this.mouse = new Mouse();
  25. this.mouse.setCanvas(canvas);
  26. }
  27. /**
  28. * Update the renderer state, update the input handlers, calculate the object and viewport transformation matrices.
  29. *
  30. * @param object Object to be updated.
  31. * @param viewport Viewport to be updated (should be the one where the objects will be rendered after).
  32. */
  33. Renderer.prototype.update = function(object, viewport)
  34. {
  35. this.mouse.update();
  36. var mouse = this.mouse;
  37. // Viewport transform matrix
  38. viewport.updateControls(mouse);
  39. viewport.updateMatrix();
  40. // Project mouse coordinates
  41. var point = mouse.position.clone();
  42. var viewportPoint = viewport.inverseMatrix.transformPoint(point);
  43. // Object transformation matrices
  44. object.traverse(function(child)
  45. {
  46. child.updateMatrix();
  47. var childPoint = child.inverseGlobalMatrix.transformPoint(viewportPoint);
  48. // Check if the mouse pointer is inside
  49. if(child.isInside(childPoint))
  50. {
  51. // Pointer enter
  52. if(!child.pointerInside)
  53. {
  54. if(child.onPointerEnter !== null)
  55. {
  56. child.onPointerEnter(mouse, viewport);
  57. }
  58. }
  59. // Pointer over
  60. if(child.onPointerOver !== null)
  61. {
  62. child.onPointerOver(mouse, viewport);
  63. }
  64. // Pointer pressed
  65. if(mouse.buttonPressed(Mouse.LEFT))
  66. {
  67. if(child.onButtonPressed !== null)
  68. {
  69. child.onButtonPressed(mouse, viewport);
  70. }
  71. }
  72. // Just pressed
  73. if(mouse.buttonJustPressed(Mouse.LEFT))
  74. {
  75. if(child.onButtonDown !== null)
  76. {
  77. child.onButtonDown(mouse, viewport);
  78. }
  79. }
  80. // Just released
  81. if(mouse.buttonJustReleased(Mouse.LEFT))
  82. {
  83. if(child.onButtonUp !== null)
  84. {
  85. child.onButtonUp(mouse, viewport);
  86. }
  87. }
  88. child.pointerInside = true;
  89. }
  90. else if(child.pointerInside)
  91. {
  92. // Pointer leave
  93. if(child.onPointerLeave !== null)
  94. {
  95. child.onPointerLeave(mouse, viewport);
  96. }
  97. child.pointerInside = false;
  98. }
  99. });
  100. };
  101. /**
  102. * Render the object using the viewport into a canvas element.
  103. *
  104. * The canvas state is saved and restored for each individual object, ensuring that the code of one object does not affect another one.
  105. *
  106. * @param object Object to be rendered.
  107. * @param viewport Viewport to render the objects.
  108. */
  109. Renderer.prototype.render = function(object, viewport)
  110. {
  111. var context = this.context;
  112. // Clear canvas
  113. context.setTransform(1, 0, 0, 1, 0, 0);
  114. context.clearRect(0, 0, this.canvas.width, this.canvas.height);
  115. // Set viewport matrix transform
  116. viewport.matrix.setContextTransform(context);
  117. // Render into the canvas
  118. object.traverse(function(child)
  119. {
  120. context.save();
  121. child.globalMatrix.tranformContext(context);
  122. child.draw(context);
  123. context.restore();
  124. });
  125. };