Reference Source

src/toolbar/ThreeDMode.js

  1. import {Controller} from "../Controller.js";
  2. import {math} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
  3.  
  4. const tempVec3a = math.vec3();
  5.  
  6. /** @private */
  7. class ThreeDMode extends Controller {
  8.  
  9. constructor(parent, cfg) {
  10.  
  11. super(parent, cfg);
  12.  
  13. if (!cfg.buttonElement) {
  14. throw "Missing config: buttonElement";
  15. }
  16.  
  17. this._saveOrthoActive = null;
  18. this._buttonElement = cfg.buttonElement;
  19.  
  20. this._cameraControlNavModeMediator = cfg.cameraControlNavModeMediator;
  21.  
  22. this._active = false;
  23.  
  24. this.on("enabled", (enabled) => {
  25. if (!enabled) {
  26. this._buttonElement.classList.add("disabled");
  27. } else {
  28. this._buttonElement.classList.remove("disabled");
  29. }
  30. });
  31.  
  32. this._buttonElement.addEventListener("click", (event) => {
  33. if (this.getEnabled()) {
  34. this.bimViewer._sectionTool.hideControl();
  35. this.setActive(!this.getActive(), () => { // Animated
  36. });
  37. }
  38. event.preventDefault();
  39. });
  40.  
  41. this.bimViewer.on("reset", () => {
  42. this.setActive(true, () => { // Animated
  43. });
  44. });
  45. }
  46.  
  47. setEnabled(enabled) {
  48. super.setEnabled(enabled);
  49. this._saveOrthoActive = this.bimViewer._orthoMode.getActive();
  50. }
  51.  
  52. setActive(active, done) {
  53. if (this._active === active) {
  54. if (done) {
  55. done();
  56. }
  57. return;
  58. }
  59. this._active = active;
  60. if (active) {
  61. this._buttonElement.classList.add("active");
  62. if (done) {
  63. this._enterThreeDMode(() => {
  64. this.fire("active", this._active);
  65. done();
  66. });
  67. } else {
  68. this._enterThreeDMode();
  69. this.fire("active", this._active);
  70. }
  71. } else {
  72. this._buttonElement.classList.remove("active");
  73. if (done) {
  74. this._exitThreeDMode(() => {
  75. this.fire("active", this._active);
  76. done();
  77. });
  78. } else {
  79. this._exitThreeDMode();
  80. this.fire("active", this._active);
  81. }
  82. }
  83. }
  84.  
  85. _enterThreeDMode(done) {
  86.  
  87. const viewer = this.viewer;
  88. const scene = viewer.scene;
  89. const aabb = scene.getAABB(scene.visibleObjectIds);
  90. const diag = math.getAABB3Diag(aabb);
  91. const center = math.getAABB3Center(aabb, tempVec3a);
  92. const dist = Math.abs(diag / Math.tan(65.0 / 2)); // TODO: fovy match with CameraFlight
  93. const camera = scene.camera;
  94. const dir = (camera.yUp) ? [-1, -1, -1] : [1, 1, 1];
  95. const up = (camera.yUp) ? [-1, 1, -1] : [-1, 1, 1];
  96.  
  97. viewer.cameraControl.pivotPos = center;
  98.  
  99. this.bimViewer._navCubeMode.setActive(true);
  100. this.bimViewer._firstPersonMode.setEnabled(true);
  101. this._cameraControlNavModeMediator.setThreeDModeActive(true);
  102. this.bimViewer._sectionTool.setEnabled(true);
  103. this.bimViewer._orthoMode.setEnabled(true);
  104.  
  105. if (done) {
  106. viewer.cameraFlight.flyTo({
  107. look: center,
  108. eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
  109. up: up,
  110. orthoScale: diag * 1.3,
  111. duration: 1,
  112. projection: this._saveOrthoActive ? "ortho" : "perspective"
  113. }, () => {
  114. done();
  115. });
  116. } else {
  117. viewer.cameraFlight.jumpTo({
  118. look: center,
  119. eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
  120. up: up,
  121. orthoScale: diag * 1.3,
  122. projection: this._saveOrthoActive ? "ortho" : "perspective"
  123. });
  124. }
  125. }
  126.  
  127. _exitThreeDMode(done) {
  128.  
  129. const viewer = this.viewer;
  130. const scene = viewer.scene;
  131. const camera = scene.camera;
  132. const aabb = scene.getAABB(scene.visibleObjectIds);
  133. const look2 = math.getAABB3Center(aabb);
  134. const diag = math.getAABB3Diag(aabb);
  135. const fitFOV = 45; // fitFOV;
  136. const sca = Math.abs(diag / Math.tan(fitFOV * math.DEGTORAD));
  137. const orthoScale2 = diag * 1.3;
  138. const eye2 = tempVec3a;
  139.  
  140. eye2[0] = look2[0] + (camera.worldUp[0] * sca);
  141. eye2[1] = look2[1] + (camera.worldUp[1] * sca);
  142. eye2[2] = look2[2] + (camera.worldUp[2] * sca);
  143.  
  144. const up2 = math.mulVec3Scalar(camera.worldForward, -1, []);
  145.  
  146. this.bimViewer._sectionTool.setActive(false);
  147. this.bimViewer._firstPersonMode.setEnabled(false);
  148.  
  149. this._saveOrthoActive = this.bimViewer._orthoMode.getActive();
  150. this.bimViewer._orthoMode.setEnabled(false);
  151.  
  152. this._cameraControlNavModeMediator.setThreeDModeActive(false);
  153.  
  154. if (done) {
  155. viewer.cameraFlight.flyTo({
  156. eye: eye2,
  157. look: look2,
  158. up: up2,
  159. orthoScale: orthoScale2,
  160. projection: "ortho"
  161. }, () => {
  162. this.bimViewer._navCubeMode.setActive(false);
  163. });
  164. } else {
  165. viewer.cameraFlight.jumpTo({
  166. eye: eye2,
  167. look: look2,
  168. up: up2,
  169. orthoScale: orthoScale2,
  170. projection: "ortho"
  171. });
  172. this.bimViewer._navCubeMode.setActive(false);
  173. }
  174. }
  175. }
  176.  
  177. export {ThreeDMode};