@combeenation/3d-viewer 18.0.0-beta1 → 18.0.0-beta2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/lib-cjs/buildinfo.json +1 -1
  2. package/dist/lib-cjs/commonjs.tsconfig.tsbuildinfo +1 -1
  3. package/dist/lib-cjs/index.d.ts +6 -0
  4. package/dist/lib-cjs/index.js +6 -0
  5. package/dist/lib-cjs/index.js.map +1 -1
  6. package/dist/lib-cjs/internal/cloning-helper.js +1 -1
  7. package/dist/lib-cjs/internal/cloning-helper.js.map +1 -1
  8. package/dist/lib-cjs/manager/camera-manager.d.ts +23 -2
  9. package/dist/lib-cjs/manager/camera-manager.js +90 -25
  10. package/dist/lib-cjs/manager/camera-manager.js.map +1 -1
  11. package/dist/lib-cjs/manager/debug-manager.d.ts +1 -1
  12. package/dist/lib-cjs/manager/debug-manager.js +2 -2
  13. package/dist/lib-cjs/manager/debug-manager.js.map +1 -1
  14. package/dist/lib-cjs/manager/dimension-line-manager.d.ts +126 -0
  15. package/dist/lib-cjs/manager/dimension-line-manager.js +138 -0
  16. package/dist/lib-cjs/manager/dimension-line-manager.js.map +1 -0
  17. package/dist/lib-cjs/manager/html-anchor-manager.d.ts +93 -0
  18. package/dist/lib-cjs/manager/html-anchor-manager.js +228 -0
  19. package/dist/lib-cjs/manager/html-anchor-manager.js.map +1 -0
  20. package/dist/lib-cjs/manager/model-manager.d.ts +0 -1
  21. package/dist/lib-cjs/manager/model-manager.js +0 -1
  22. package/dist/lib-cjs/manager/model-manager.js.map +1 -1
  23. package/dist/lib-cjs/manager/parameter-manager.d.ts +1 -1
  24. package/dist/lib-cjs/manager/scene-manager.js +9 -2
  25. package/dist/lib-cjs/manager/scene-manager.js.map +1 -1
  26. package/dist/lib-cjs/viewer.d.ts +6 -2
  27. package/dist/lib-cjs/viewer.js +13 -1
  28. package/dist/lib-cjs/viewer.js.map +1 -1
  29. package/package.json +2 -1
  30. package/src/index.ts +6 -0
  31. package/src/internal/cloning-helper.ts +1 -1
  32. package/src/manager/camera-manager.ts +152 -40
  33. package/src/manager/debug-manager.ts +2 -2
  34. package/src/manager/dimension-line-manager.ts +255 -0
  35. package/src/manager/html-anchor-manager.ts +332 -0
  36. package/src/manager/model-manager.ts +0 -1
  37. package/src/manager/parameter-manager.ts +1 -1
  38. package/src/manager/scene-manager.ts +11 -2
  39. package/src/viewer.ts +17 -1
@@ -1,5 +1,5 @@
1
1
  import * as Index from './index';
2
- import { AbstractEngine, CameraManager, DebugManager, DefaultSceneSettings, EngineOptions, EventManager, GltfExportManager, MaterialManager, ModelManager, ParameterManager, ParameterSubject, Scene, SceneManager, TextureManager, TransformNode } from './index';
2
+ import { AbstractEngine, CameraManager, DebugManager, DefaultSceneSettings, DimensionLineManager, EngineOptions, EventManager, GltfExportManager, HtmlAnchorManager, MaterialManager, ModelManager, ParameterManager, ParameterSubject, Scene, SceneManager, TextureManager, TransformNode } from './index';
3
3
  /**
4
4
  * Use this to define geometry to be excluded from autofocus, GLB export, etc.
5
5
  */
@@ -51,8 +51,10 @@ export declare class Viewer {
51
51
  protected _scene: Scene;
52
52
  protected _cameraManager: CameraManager;
53
53
  protected _debugManager: DebugManager;
54
+ protected _dimensionLineManager: DimensionLineManager;
54
55
  protected _eventManager: EventManager;
55
56
  protected _gltfExportManager: GltfExportManager;
57
+ protected _htmlAnchorManager: HtmlAnchorManager;
56
58
  protected _materialManager: MaterialManager;
57
59
  protected _modelManager: ModelManager;
58
60
  protected _parameterManager: ParameterManager;
@@ -64,8 +66,10 @@ export declare class Viewer {
64
66
  get engine(): AbstractEngine;
65
67
  get cameraManager(): CameraManager;
66
68
  get debugManager(): DebugManager;
69
+ get dimensionLineManager(): DimensionLineManager;
67
70
  get eventManager(): EventManager;
68
71
  get gltfExportManager(): GltfExportManager;
72
+ get htmlAnchorManager(): HtmlAnchorManager;
69
73
  get materialManager(): MaterialManager;
70
74
  get modelManager(): ModelManager;
71
75
  get parameterManager(): ParameterManager;
@@ -88,7 +92,7 @@ export declare class Viewer {
88
92
  */
89
93
  constructor(canvas?: HTMLCanvasElement | undefined, viewerSettings?: DeepPartial<ViewerSettings>, defaultSceneSettings?: DeepPartial<DefaultSceneSettings>);
90
94
  /**
91
- * Pause rendering can be usefull when doing internal scene processings that should not be visible to the user,
95
+ * Pause rendering can be useful when doing internal scene processings that should not be visible to the user,
92
96
  * e.g. cloning meshes for gltf export
93
97
  */
94
98
  pauseRendering(): void;
@@ -84,12 +84,18 @@ class Viewer {
84
84
  get debugManager() {
85
85
  return this._debugManager;
86
86
  }
87
+ get dimensionLineManager() {
88
+ return this._dimensionLineManager;
89
+ }
87
90
  get eventManager() {
88
91
  return this._eventManager;
89
92
  }
90
93
  get gltfExportManager() {
91
94
  return this._gltfExportManager;
92
95
  }
96
+ get htmlAnchorManager() {
97
+ return this._htmlAnchorManager;
98
+ }
93
99
  get materialManager() {
94
100
  return this._materialManager;
95
101
  }
@@ -119,7 +125,7 @@ class Viewer {
119
125
  return Index;
120
126
  }
121
127
  /**
122
- * Pause rendering can be usefull when doing internal scene processings that should not be visible to the user,
128
+ * Pause rendering can be useful when doing internal scene processings that should not be visible to the user,
123
129
  * e.g. cloning meshes for gltf export
124
130
  */
125
131
  pauseRendering() {
@@ -162,13 +168,19 @@ class Viewer {
162
168
  engine.getCaps().parallelShaderCompile = undefined;
163
169
  }
164
170
  this._scene = new index_1.Scene(engine);
171
+ // NOTE: rendering group id "1" is reserved for occlusion helper sphere (see `HtmlAnchorManager`)
172
+ // rendering group id "1" has the same depth buffer as 0 in order to make this work
173
+ // => use rendering group id "2" or higher for keeping meshes in foreground
174
+ this._scene.setRenderingAutoClearDepthStencil(1, false, false, false);
165
175
  // NOTE: order of manage seems to be a bit counter intuitive as it's sorted alphabetically
166
176
  // semantically one would start with scene manager, etc...
167
177
  // still this is a good test as the order of manager constructors should not matter
168
178
  this._cameraManager = new index_1.CameraManager(this);
169
179
  this._debugManager = new index_1.DebugManager(this);
180
+ this._dimensionLineManager = new index_1.DimensionLineManager(this);
170
181
  this._eventManager = new index_1.EventManager(this);
171
182
  this._gltfExportManager = new index_1.GltfExportManager(this);
183
+ this._htmlAnchorManager = new index_1.HtmlAnchorManager(this);
172
184
  this._materialManager = new index_1.MaterialManager(this);
173
185
  this._modelManager = new index_1.ModelManager(this);
174
186
  this._parameterManager = new index_1.ParameterManager(this);
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/viewer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/viewer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@combeenation/3d-viewer",
3
- "version": "18.0.0-beta1",
3
+ "version": "18.0.0-beta2",
4
4
  "description": "Combeenation 3D Viewer",
5
5
  "homepage": "https://github.com/Combeenation/3d-viewer#readme",
6
6
  "bugs": {
@@ -54,6 +54,7 @@
54
54
  "@babylonjs/loaders": "7.47.3",
55
55
  "@babylonjs/serializers": "7.47.3",
56
56
  "eventemitter3": "4.0.7",
57
+ "html2canvas": "1.4.1",
57
58
  "is-svg": "^5.0.0",
58
59
  "lodash-es": "4.17.21"
59
60
  },
package/src/index.ts CHANGED
@@ -21,6 +21,7 @@ export * from '@babylonjs/core/Debug/axesViewer';
21
21
  export * from '@babylonjs/core/Debug/debugLayer';
22
22
  export * from '@babylonjs/core/Engines/abstractEngine';
23
23
  export * from '@babylonjs/core/Engines/engine';
24
+ export * from '@babylonjs/core/Engines/Extensions/engine.query';
24
25
  export * from '@babylonjs/core/Engines/nullEngine';
25
26
  export * from '@babylonjs/core/Engines/thinEngine';
26
27
  export * from '@babylonjs/core/Lights';
@@ -33,14 +34,17 @@ export * from '@babylonjs/core/Maths';
33
34
  export * from '@babylonjs/core/Meshes/abstractMesh';
34
35
  export * from '@babylonjs/core/Meshes/geometry';
35
36
  export * from '@babylonjs/core/Meshes/instancedMesh';
37
+ export * from '@babylonjs/core/Meshes/linesMesh';
36
38
  export * from '@babylonjs/core/Meshes/mesh';
37
39
  export * from '@babylonjs/core/Meshes/meshBuilder';
38
40
  export * from '@babylonjs/core/Meshes/transformNode';
41
+ export * from '@babylonjs/core/Misc/observable';
39
42
  export * from '@babylonjs/core/Misc/interfaces/screenshotSize';
40
43
  export * from '@babylonjs/core/Misc/screenshotTools';
41
44
  export * from '@babylonjs/core/Misc/tags';
42
45
  export * from '@babylonjs/core/Morph';
43
46
  export * from '@babylonjs/core/node';
47
+ export * from '@babylonjs/core/Rendering/boundingBoxRenderer';
44
48
  export * from '@babylonjs/core/Rendering/utilityLayerRenderer';
45
49
  export * from '@babylonjs/core/scene';
46
50
  export * from '@babylonjs/core/types';
@@ -66,9 +70,11 @@ export * from '@babylonjs/core/Materials/Node';
66
70
  export * from './viewer';
67
71
  export * from './viewer-error';
68
72
  export * from './manager/camera-manager';
73
+ export * from './manager/dimension-line-manager';
69
74
  export * from './manager/debug-manager';
70
75
  export * from './manager/event-manager';
71
76
  export * from './manager/gltf-export-manager';
77
+ export * from './manager/html-anchor-manager';
72
78
  export * from './manager/material-manager';
73
79
  export * from './manager/model-manager';
74
80
  export * from './manager/parameter-manager';
@@ -186,7 +186,7 @@ function _cloneNode(
186
186
  // making deep copies of the node metadata might be an optional flag in the cloning functions in the future
187
187
 
188
188
  // ATM the assignment from clone to source is needed for reassigning instanced meshes after cloning
189
- // may be usefull for other node types in the future as well
189
+ // may be useful for other node types in the future as well
190
190
  setInternalMetadataValue(clone, 'cloneSource', node.uniqueId);
191
191
  setInternalMetadataValue(node, 'cloneTarget', clone.uniqueId);
192
192
 
@@ -4,7 +4,6 @@ import {
4
4
  ArcRotateCamera,
5
5
  BoundingSphere,
6
6
  ExcludedGeometryList,
7
- IScreenshotSize,
8
7
  ScreenshotTools,
9
8
  Vector3,
10
9
  Viewer,
@@ -64,6 +63,11 @@ export type ScreenshotSettings = {
64
63
  autofocusScene?: boolean;
65
64
  /** Optional list of geometry to be excluded from consideration */
66
65
  exclude?: ExcludedGeometryList;
66
+ /**
67
+ * Optional list of html anchor groups (see {@link HtmlAnchorManager}), that should be excluded from the screenshot.\
68
+ * Excludes ALL html anchor groups if set to `true`.
69
+ */
70
+ excludeHtmlAnchorGroups?: string[] | true;
67
71
  /**
68
72
  * "MIME type" of the returned screenshot image, defaults to `image/png`
69
73
  *
@@ -89,11 +93,27 @@ export type ScreenshotSettings = {
89
93
  quality?: number;
90
94
  };
91
95
 
96
+ /**
97
+ * Internal data type for screenshot sizing.
98
+ * `imageWidth/Height` defines the size of the final image.
99
+ * `canvasWidth/Height` is the size of the canvas from which the screenshot is taken.
100
+ * Canvas size always has the same aspect ratio as the viewport and is larger than image size, as the final image may be
101
+ * cropped.
102
+ *
103
+ * @internal
104
+ */
105
+ export type ScreenshotSize = {
106
+ imageWidth: number;
107
+ imageHeight: number;
108
+ canvasWidth: number;
109
+ canvasHeight: number;
110
+ };
111
+
92
112
  /**
93
113
  * Manager for camera related tasks
94
114
  */
95
115
  export class CameraManager {
96
- public static readonly CAMERA_ANIMATION_NAME = '__cameraAnimation__';
116
+ public static readonly CAMERA_ANIMATION_NAME = '$cameraAnimation';
97
117
 
98
118
  /** @internal */
99
119
  public static readonly DEFAULT_CAMERA_POSITION: CameraPosition = {
@@ -112,7 +132,7 @@ export class CameraManager {
112
132
 
113
133
  protected static readonly _DEFAULT_AUTOFOCUS_RADIUS_FACTOR = 1;
114
134
  protected static readonly _DEFAULT_CAM_SPEED_MS = 250;
115
- protected static readonly _SCREENSHOT_CAMERA_NAME = '__screenshotCamera__';
135
+ protected static readonly _SCREENSHOT_CAMERA_NAME = '$screenshotCamera';
116
136
 
117
137
  /** @internal */
118
138
  public constructor(protected viewer: Viewer) {}
@@ -269,21 +289,38 @@ export class CameraManager {
269
289
  * The result is a string containing a base64 encoded image.
270
290
  */
271
291
  public async createScreenshot(settings?: ScreenshotSettings): Promise<string> {
292
+ const {
293
+ width,
294
+ height,
295
+ alpha,
296
+ beta,
297
+ radius,
298
+ target,
299
+ autofocusScene,
300
+ exclude,
301
+ excludeHtmlAnchorGroups,
302
+ fileName,
303
+ samples,
304
+ antialiasing,
305
+ renderSprites,
306
+ enableStencilBuffer,
307
+ useLayerMask,
308
+ quality,
309
+ } = settings ?? {};
310
+
272
311
  const screenshotCam = this.viewer.scene.activeCamera?.clone(
273
312
  CameraManager._SCREENSHOT_CAMERA_NAME
274
313
  ) as ArcRotateCamera;
275
- const boundingInfo = settings?.autofocusScene
276
- ? this.viewer.sceneManager.calculateBoundingInfo(settings.exclude)
277
- : undefined;
314
+ const boundingInfo = autofocusScene ? this.viewer.sceneManager.calculateBoundingInfo(exclude) : undefined;
278
315
 
279
- if (settings?.alpha !== undefined) {
280
- screenshotCam.alpha = settings.alpha;
316
+ if (alpha !== undefined) {
317
+ screenshotCam.alpha = alpha;
281
318
  }
282
- if (settings?.beta !== undefined) {
283
- screenshotCam.beta = settings.beta;
319
+ if (beta !== undefined) {
320
+ screenshotCam.beta = beta;
284
321
  }
285
- if (settings?.radius !== undefined) {
286
- screenshotCam.radius = settings.radius;
322
+ if (radius !== undefined) {
323
+ screenshotCam.radius = radius;
287
324
  } else if (boundingInfo) {
288
325
  // zoom out to have full scene in view if requested by `autofocusScene` flag
289
326
  const distance = this._getAutofocusZoomingDistance(boundingInfo.boundingSphere, screenshotCam);
@@ -292,44 +329,90 @@ export class CameraManager {
292
329
  }
293
330
  // `cloneAlphaBetaRadius` has to be set to true, otherwise these values get adapted by setting the new target
294
331
  // this would also be the case when setting `screenshotCam.target` directly
295
- if (settings?.target !== undefined) {
296
- screenshotCam.setTarget(settings.target, undefined, undefined, true);
332
+ if (target !== undefined) {
333
+ screenshotCam.setTarget(target, undefined, undefined, true);
297
334
  } else if (boundingInfo) {
298
335
  screenshotCam.setTarget(boundingInfo.boundingSphere.center, undefined, undefined, true);
299
336
  }
300
337
 
301
- // don't expose internal props of `IScreenshotSize` in the API (yet), as it gets rather confusing and it shouldn't
302
- // be necessary in the first place
303
- // also let Babylon.js do all the fallback handling for missing properties
304
- const size: IScreenshotSize = { width: settings?.width, height: settings?.height };
338
+ // calculate screenshot size manually as it is used for html anchor screenshot as well
339
+ const screenshotSize = this._getScreenshotSize(width, height);
340
+ const mimeType = settings?.mimeType ?? 'image/png';
341
+
342
+ const imageStr3d = await ScreenshotTools.CreateScreenshotUsingRenderTargetAsync(
343
+ this.viewer.engine,
344
+ screenshotCam,
345
+ { width: screenshotSize.imageWidth, height: screenshotSize.imageHeight },
346
+ mimeType,
347
+ samples,
348
+ antialiasing,
349
+ undefined,
350
+ renderSprites,
351
+ enableStencilBuffer,
352
+ useLayerMask,
353
+ quality,
354
+ texture => {
355
+ // NOTE: this doesn't work ATM, see https://github.com/BabylonJS/Babylon.js/pull/16081#issuecomment-2652861176
356
+ // we'll have to wait for a fix or solve the visibility in a different way (e.g. camera layer mask)
357
+ texture.renderList = this.viewer.scene.meshes.filter(
358
+ mesh => !settings?.exclude || !isNodeExcluded(mesh, settings.exclude)
359
+ );
360
+ }
361
+ );
305
362
 
306
- // for some reason the `customizeTexture` property is not exposed in the async version of this function, therefore
307
- // we create the promise here manually
308
- const imageStr = await new Promise<string>(resolve => {
309
- ScreenshotTools.CreateScreenshotUsingRenderTarget(
310
- this.viewer.engine,
363
+ let imageStr = '';
364
+ const htmlAnchorKeys =
365
+ excludeHtmlAnchorGroups === true
366
+ ? []
367
+ : this.viewer.htmlAnchorManager.getHtmlAnchorKeys(undefined, excludeHtmlAnchorGroups, true);
368
+ if (htmlAnchorKeys.length) {
369
+ // html anchors are not included in the main screenshot, as the html elements are located outside of the canvas
370
+ // the idea is to create a dedicated canvas for these elements and merge the result with the main screenshot into
371
+ // a combined canvas
372
+ const screenshotHtmlCanvas = await this.viewer.htmlAnchorManager.createScreenshotCanvas(
373
+ screenshotSize,
311
374
  screenshotCam,
312
- size,
313
- (data: string) => resolve(data),
314
- settings?.mimeType,
315
- settings?.samples,
316
- settings?.antialiasing,
317
- settings?.fileName,
318
- settings?.renderSprites,
319
- settings?.enableStencilBuffer,
320
- settings?.useLayerMask,
321
- settings?.quality,
322
- texture => {
323
- texture.renderList = this.viewer.scene.meshes.filter(
324
- mesh => !settings?.exclude || !isNodeExcluded(mesh, settings.exclude)
325
- );
326
- }
375
+ htmlAnchorKeys
327
376
  );
328
- });
377
+
378
+ // convert the main screenshot into an image, so that it can be drawn onto a canvas as well
379
+ const screenshot3dImg = new Image();
380
+ screenshot3dImg.src = imageStr3d;
381
+ await new Promise(resolve => {
382
+ screenshot3dImg.onload = resolve;
383
+ });
384
+
385
+ const screenshotCombinedCanvas = document.createElement('canvas');
386
+ screenshotCombinedCanvas.width = screenshotSize.imageWidth;
387
+ screenshotCombinedCanvas.height = screenshotSize.imageHeight;
388
+
389
+ // draw main and html screenshot on a new canvas and get the base64 string from it
390
+ const context = screenshotCombinedCanvas.getContext('2d')!;
391
+ context.drawImage(screenshot3dImg, 0, 0, screenshotSize.imageWidth, screenshotSize.imageHeight);
392
+ context.drawImage(screenshotHtmlCanvas, 0, 0, screenshotSize.imageWidth, screenshotSize.imageHeight);
393
+ imageStr = screenshotCombinedCanvas.toDataURL(mimeType);
394
+
395
+ screenshotCombinedCanvas.remove();
396
+ } else {
397
+ imageStr = imageStr3d;
398
+ }
329
399
 
330
400
  screenshotCam.dispose();
331
401
 
332
- return imageStr;
402
+ if (fileName) {
403
+ // rebuild Babylon.js default behaviour: if a file name is given, download the screenshot instead of returning the
404
+ // data string
405
+ const link = document.createElement('a');
406
+ link.href = imageStr;
407
+ link.download = fileName;
408
+ document.body.appendChild(link);
409
+ link.click();
410
+ document.body.removeChild(link);
411
+
412
+ return '';
413
+ } else {
414
+ return imageStr;
415
+ }
333
416
  }
334
417
 
335
418
  protected static _addCameraAnimationToGroup(
@@ -375,4 +458,33 @@ export class CameraManager {
375
458
 
376
459
  return distance;
377
460
  }
461
+
462
+ protected _getScreenshotSize(width?: number, height?: number): ScreenshotSize {
463
+ const canvas = this.viewer.canvas!;
464
+ const aspectRatio = canvas.width / canvas.height;
465
+
466
+ let imageWidth = 0;
467
+ let imageHeight = 0;
468
+ if (width && height) {
469
+ imageWidth = width;
470
+ imageHeight = height;
471
+ } else if (width && !height) {
472
+ imageWidth = width;
473
+ imageHeight = width / aspectRatio;
474
+ } else if (!width && height) {
475
+ imageWidth = height * aspectRatio;
476
+ imageHeight = height;
477
+ } else {
478
+ imageWidth = canvas.width;
479
+ imageHeight = canvas.height;
480
+ }
481
+
482
+ // canvas size only differs from image size if both width and height are set
483
+ // in this case the aspect ratio differs from the canvas aspect ratio and some parts of the canvas have to be
484
+ // cropped for the screenshot
485
+ const canvasWidth = width && height ? height * aspectRatio : imageWidth;
486
+ const canvasHeight = imageHeight;
487
+
488
+ return { imageWidth, imageHeight, canvasWidth, canvasHeight };
489
+ }
378
490
  }
@@ -20,7 +20,7 @@ import {
20
20
  * Manager for debugging functionalities
21
21
  */
22
22
  export class DebugManager {
23
- protected static _BOUNDING_SPHERE_KEY = '__bounding_sphere__';
23
+ protected static _BOUNDING_SPHERE_KEY = '$boundingSphere';
24
24
 
25
25
  protected _axesViewer: AxesViewer | null = null;
26
26
  protected _showBoundingSphereForAutofocus: boolean = false;
@@ -145,7 +145,7 @@ The inspector can only be used in development builds.`);
145
145
 
146
146
  /**
147
147
  * Draws a wireframe bounding sphere on the next call of {@link CameraManager.autofocusActiveCamera}.\
148
- * This is usefull for checking which parts of the scene get centered.
148
+ * This is useful for checking which parts of the scene get centered.
149
149
  */
150
150
  public showBoundingSphereForAutofocus(): void {
151
151
  this._showBoundingSphereForAutofocus = true;